我在使用JUnit测试功能时解析JSON时遇到了问题。我想测试我的解析逻辑。在我执行测试用例时,我收到一条错误消息:
java.lang.RuntimeException: Method getString in org.json.JSONObject not mocked
我已经读过需要为测试提供额外的依赖性,因为Android SDK提供了org.json
,所以我已经加入了gradle:
testImplementation 'org.json:json:20180130'
不幸的是,这没有效果。在JSON对象上执行函数getString()
时发生错误:
json.getString(JSON_TYPE)
有没有人遇到类似的问题,知道如何处理它?</ p>
// EDIT
这是负责解析并导致问题的函数(缩写形式):
fun parse(jsonString: String) {
val json = JSONObject(jsonString)
val type = json.getString(JSON_TYPE) //here occurs an error
val id = json.getString(JSON_ID)
}
答案 0 :(得分:1)
请参阅开发人员指南的"Error: method not mocked"部分:
如果您运行的是从Android SDK调用API的测试 不要模拟,你会收到一个错误,说这个方法没有被嘲笑。 那是因为用于运行单元测试的android.jar文件没有 包含任何实际代码(这些API仅由Android提供 设备上的系统映像。)
相反,所有方法都默认抛出异常。这是为了确保 您的单元测试只测试您的代码而不依赖于任何代码 Android平台的特殊行为(你还没有 明确嘲笑,例如Mockito)。
JSONObject
不是序列化/反序列化JSON的好方法 - 有更好的选择,如Gson和Moshi。但是,如果您必须使用它并且需要进行单元测试,则可以安装Robolectric,它提供称为“阴影”的测试双打,如JSONObject
。
答案 1 :(得分:1)
只需结合以上所有答案
android{
.
.
.
testOptions {
unitTests {
returnDefaultValues = true
includeAndroidResources = true
}
}
}
以及添加
testImplementation 'org.json:json:20160810'
您的build.gradle文件中的应该可以解决您的问题
答案 2 :(得分:1)
您需要在 build.gradle 中添加以下内容: 下面的代码对我有用,当我需要在测试中解析 Json
android {
// ...
testOptions {
unitTests.returnDefaultValues = true
}
}
和
dependencies {
//...
testImplementation 'org.json:json:20180813'
}