junit 如何在Android Studio上的本地测试中读取json文件?

vlurs2pr  于 2022-11-11  发布在  Android
关注(0)|答案(1)|浏览(218)

我正在使用MockWebServer进行测试。
而且我需要大量的JSON文件来存放请求和响应数据。
硬编码的json值看起来很乱,我想创建json文件。
所以,我在资源(测试)中创建了json文件,并尝试用这些方法读取文件。

object TestHelper {
    fun read(fileName: String): String {
        val resource = javaClass.classLoader?.getResource(fileName)
        return resource?.readText() ?: ""
    }

    fun readJson(fileName: String): String {
        val byteArray = readBinaryFileFromResources(fileName)
        val sb = StringBuilder("")

        byteArray.forEach {
            println("byte: $it")
            sb.append(it as Char)
        }

        return sb.toString()
    }

    @Throws(IOException::class)
    fun readBinaryFileFromResources(fileName: String): ByteArray {
        var inputStream: InputStream? = null
        val byteStream = ByteArrayOutputStream()
        try {
            inputStream = javaClass.classLoader?.getResourceAsStream(fileName)

            var nextValue = inputStream?.read() ?: -1

            while (nextValue != -1) {
                byteStream.write(nextValue)
                nextValue = inputStream?.read() ?: -1
            }
            return byteStream.toByteArray()
        } catch (e: Exception) {
            println(e.stackTraceToString())
            return byteStream.toByteArray()
        } finally {
            inputStream?.close()
            byteStream.close()
        }
    }
}

没有一个看起来能用。这个代码有什么问题?

30byixjq

30byixjq1#

我以前遇到过这样的问题,我相信这与从调用点获取正确的classLoader有关,也与src/test/resources中的资源不能被正确访问有关。我最终通过将调用测试类作为一个具体化的类型参数传入来使它工作:

inline fun <reified T> loadFileText(
    caller: T,
    filePath: String
): String =
    T::class.java.getResource(filePath)?.readText() ?: throw IllegalArgumentException(
        "Could not find file $filePath. Make sure to put it in the correct resources folder for $caller's runtime."
    )

对于我的设置,我有一个单独的共享模块:testtools,我使用testImplementation将其包含在我的:app的gradle构建中,这样它们就不会编译到生产APK中。我的测试资源位于:

/testtools/src/main/resources/customfolder

然后从:app中的一个单元测试类调用它,如下所示:

class UnitTestClass {

    @Test
    fun myTest() {
        loadFileText(this, "/customfolder/file_name.txt")
    }
}

你可能会有一些运气,把你的资源直接到/app/src/test/resources/customfolder,我还没有尝试在一段时间。

相关问题