【问题标题】:Unable to read Json File using a MockServerResponse无法使用 MockServerResponse 读取 Json 文件
【发布时间】:2021-05-11 19:38:48
【问题描述】:

我一直在使用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()
  }
}

【问题讨论】:

    标签: android unit-testing kotlin retrofit mockwebserver


    【解决方案1】:

    您应该在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
    }
        
    
    

    【讨论】:

    • 问题是没有从资产文件夹中读取文件。因此,它会抛出 NullPointerException。这是我的路径“src/main/assets/success_response.json”。而且我也厌倦了传递“success_response.json”。还是同样的问题。
    • 不客气。如果有效,请接受我的回答。
    猜你喜欢
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 2016-06-01
    相关资源
    最近更新 更多