无法使用 MockServerResponse 读取 Json 文件

问题描述

我一直在使用 Retrofit 并且我正在尝试对代码进行单元测试。因此,我尝试创建一个名为 success_response.jsonFailed_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."""
        )
    }
}

以上基于以下项目结构:

enter image description here

如果您希望可以从单元测试和仪器测试访问您的文件,请将其添加到您的 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
}