与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))
}
}
但是,当测试运行时,它会失败!
什么给了?!
答案是在Android Studio的unit testing support文档中 - 未嘲笑。
用于运行单元测试的Android.jar文件不包含由真实设备上Android System Image提供的任何实际代码。相反,所有方法都投掷异常(默认情况下)。这是为了确保您的单元测试仅测试您的代码,并且不依赖Android平台的任何特定行为(您尚未明确嘲笑)。
这基本上是指JSON in Java库(包含JSONObject
和JSONArray
之类的类)是Android SDK的一部分,默认情况下不可用于单元测试。要解决这个问题,我们必须在 build.gradle 文件中明确添加该库。
dependencies {
...
testImplementation 'org.junit.jupiter:junit-jupiter:5.9.1'
testImplementation 'org.json:json:20220924'
}
现在,当测试再次运行时,您应该看到它通过!
这是一个棘手的实现细节,并不是很明显且容易找到答案。下次您为JSON相关功能编写单元测试时请记住这一点。
以下视频逐步逐步讨论此主题,并提供更多详细信息。这篇书面文章更多地是一个摘要的参考。如果您完全了解我如何到达某些时候,请观看视频。