【问题标题】:Android org.json.JSONObject returns null in unit testsAndroid org.json.JSONObject 在单元测试中返回 null
【发布时间】:2018-04-05 08:25:38
【问题描述】:

我在使用 JUnit 测试功能时遇到了与解析 JSON 相关的问题。我想测试我的解析逻辑。在执行测试用例时,我收到一条错误消息:

java.lang.RuntimeException: Method getString in org.json.JSONObject not mocked

我读到需要为测试提供额外的依赖,因为org.json是随Android SDK提供的,所以我已经放入了gradle:

testImplementation 'org.json:json:20180130'

很遗憾,这没有任何效果。在 JSON 对象上执行函数 getString() 时发生错误:

json.getString(JSON_TYPE)

有没有人遇到过类似的问题并且知道如何处理?

//编辑

这里是负责解析并导致问题的函数(缩写形式):

fun parse(jsonString: String) {
   val json = JSONObject(jsonString)
   val type = json.getString(JSON_TYPE) //here occurs an error
   val id = json.getString(JSON_ID)
}

【问题讨论】:

  • 你能把剩下的测试用例贴出来吗?
  • @JanVladimirMostert 请看一下我编辑的帖子
  • 您在使用robolectric.org 吗?如果是这样,使用 @RunWith(RobolectricTestRunner.class) 注释您的测试类应该可以正确模拟 JSONObject。
  • 我没用,希望不用Robolectric也能解决问题。如果没有,我一定会使用它。

标签: android json junit kotlin


【解决方案1】:

您需要在 build.gradle 中添加以下内容: 下面的代码适用于我,当我需要在测试中解析 Json 时

android {
  // ...
  testOptions { 
    unitTests.returnDefaultValues = true
  }
}

dependencies {
//...
    testImplementation 'org.json:json:20180813'
}

【讨论】:

    【解决方案2】:

    只是结合上面所有的答案

    android{
    .
    .
    .
    testOptions {
            unitTests {
                returnDefaultValues = true
                includeAndroidResources = true
            }
        }
    }
    

    以及添加

    testImplementation 'org.json:json:20160810'
    

    在您的 build.gradle 文件中将解决您的问题

    【讨论】:

    • unitTests.includeAndroidResources = true 不需要使其工作
    【解决方案3】:

    请参阅开发者指南的"Error: method not mocked" 部分:

    如果您运行的测试从您执行的 Android SDK 调用 API 不模拟,你会收到一个错误,说这个方法没有模拟。 那是因为用于运行单元测试的 android.jar 文件没有 包含任何实际代码(这些 API 仅由 Android 提供 设备上的系统映像)。

    相反,默认情况下,所有方法都会抛出异常。这是为了确保 您的单元测试仅测试您的代码,不依赖于任何 Android 平台的特定行为(您没有 显式模拟,例如使用 Mockito)。

    JSONObject 不是序列化/反序列化 JSON 的好方法 - 有更好的选择,例如 Gson 和 Moshi。但是,如果您必须使用它并且需要进行单元测试,您可以安装 Robolectric,它提供称为“影子”的 Android 类的测试替身,例如 JSONObject

    【讨论】:

    • 过了一会儿,事实证明添加testImplementation 'org.json:json:20180130' 我的测试开始起作用了。当然,将来我会将我的实现从org.json 更改为GSON。感谢您的帮助。
    猜你喜欢
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-02
    • 2014-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多