Android org.json.JSONObject在单元测试中返回null

时间:2018-04-05 08:25:39

标签: android json junit kotlin

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

3 个答案:

答案 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'
}