问题描述
我一直在使用 Retrofit
并且我正在尝试对代码进行单元测试。因此,我尝试创建一个名为 success_response.json
和 Failed_response.json
的模拟 Json 文件,并将其保存在我项目的资源文件夹中。当我测试下面的代码时,它抛出 NullPointerException
@Test
fun `read Sample Success Json File `() {
val reader = MockResponseFileReader("success_response.json")
assertNotNull(reader.content)
}
MockResponseFileReader.kt
class MockResponseFileReader(path : String) {
var content : String
init {
val reader = InputStreamReader(this.javaClass.classLoader?.getResourceAsstream(path))
content = reader.readText()
reader.close()
}
}
解决方法
您应该在 InputStream
周围添加一些检查。我正在使用这个:
internal fun getStringFromFile(filePath: String,debug: Boolean = false): String {
val classLoader = NetworkTestHelper::class.java.classLoader
if (classLoader != null) {
try {
val inputString = classLoader.getResourceAsStream(filePath).bufferedReader().use { it.readText() }
if (debug) println("Output from inputfile is: $inputString")
return inputString
} catch (e: FileNotFoundException) {
println("Could not find the specified file: $filePath")
throw e
}
} else {
throw IllegalStateException(
"""Classloader is null. Can't open an inputstream for the specified file: $filePath without it."""
)
}
}
以上基于以下项目结构:
如果您希望可以从单元测试和仪器测试访问您的文件,请将其添加到您的 build.gradle
(App) 文件中:
android {
...
sourceSets {
def commonTestDir = 'src/commonTest/java'
test {
java.srcDirs += commonTestDir
resources.srcDirs += ['src/commonTest/resources']
}
androidTest {
java.srcDirs += commonTestDir
resources.srcDirs += ['src/commonTest/resources']
}
}
...
你在测试中像这样使用它:
@Test
fun whenClickingOk_shouldSaveSelectedItems() {
mockWebServer.enqueue(
MockResponse()
.setResponseCode(200)
.setBody(
getStringFromFile(
"worklist/multiple_worklist_item_result.json",true
)
)
)
... // Rest of your test code
}