单位测试JSON功能在Android中功能
#json #android #junit #unittest

与JSON合作在Android应用中非常普遍。解析API响应,读取JSON文件,创建JSON对象发送到服务器的一些示例。就像您的好程序员一样,您可能想编写单元测试来测试处理JSON的功能。但是这样做,您可能会遇到一个令人惊讶且令人困惑的问题。让我详细说明。

想象我们有一个简单的函数,可以验证给定的字符串是否有效JSON。

class Validator {
    fun isStringValidJSON(string: String): Boolean {
        try {
            JSONObject(string)
        } catch (objEx: JSONException) {
            try {
                JSONArray(string)
            } catch (arrEx: JSONException) {
                return false
            }
        }
        return true
    }
}
这些示例中使用了

JUnit 5。要运行使用Junit 5编写的单元测试,需要将以下内容添加到 build.gradle 文件中。

tasks.withType(Test){
    useJUnitPlatform()
}

然后,我们进行了一个单元测试,该测试验证上述函数的逻辑。当传递无效的JSON字符串时,它应该返回false。理想情况下,本单元测试应通过。

internal class ValidatorTest {
    @Test
    fun jsonStringIsInvalid() {
        val validator = Validator()
        val string = "lorem ipsum"
        Assertions.assertFalse(validator.isStringValidJSON(string))
    }
}

但是,当测试运行时,它会失败!

Unit test failing in Android Studio

什么给了?!

答案是在Android Studio的unit testing support文档中 - 未嘲笑。

用于运行单元测试的Android.jar文件不包含由真实设备上Android System Image提供的任何实际代码。相反,所有方法都投掷异常(默认情况下)。这是为了确保您的单元测试仅测试您的代码,并且不依赖Android平台的任何特定行为(您尚未明确嘲笑)。

这基本上是指JSON in Java库(包含JSONObjectJSONArray之类的类)是Android SDK的一部分,默认情况下不可用于单元测试。要解决这个问题,我们必须在 build.gradle 文件中明确添加该库。

dependencies {
    ...
    testImplementation 'org.junit.jupiter:junit-jupiter:5.9.1'
    testImplementation 'org.json:json:20220924'
}

现在,当测试再次运行时,您应该看到它通过!

Unit test passing in Android Studio


这是一个棘手的实现细节,并不是很明显且容易找到答案。下次您为JSON相关功能编写单元测试时请记住这一点。


以下视频逐步逐步讨论此主题,并提供更多详细信息。这篇书面文章更多地是一个摘要的参考。如果您完全了解我如何到达某些时候,请观看视频。