Android单元测试没有嘲笑

use*_*451 44 junit android unit-testing

我按照了这个指南 https://sites.google.com/a/android.com/tools/tech-docs/unit-testing-support, 但我遇到了这个错误:

junit.framework.AssertionFailedError: Exception in constructor: testSaveJson (java.lang.RuntimeException: Method put in org.json.JSONObject not mocked. See https://sites.google.com/a/android.com/tools/tech-docs/unit-testing-support for details.
Run Code Online (Sandbox Code Playgroud)

我按照指南的说法修改了Gradle,但它并没有什么区别

 testOptions { 
    unitTests.returnDefaultValues = true
  }
Run Code Online (Sandbox Code Playgroud)

Ben*_*son 90

JSON与Android SDK捆绑在一起,所以你只需要打一个存根.您可以引入一个JSON jar,它将提供要使用的真实对象.

为此,您需要将其添加到build.gradle:

testImplementation 'org.json:json:20140107'

或者,您可以下载并包含jar.

testCompile files('libs/json.jar')
Run Code Online (Sandbox Code Playgroud)

请注意,最新版本的JSON是为Java 8构建的,因此您需要获取20140107

  • 看起来你现在可以使用Gradle了,所以`testCompile'org.json:json:20140107'`很好. (9认同)
  • 你应该使用这个版本:`org.json:json:20080701`,它与Android版本相匹配.在这个版本中,当值为json为null时,`getString()`返回null,而不是抛出异常. (8认同)

Joo*_*lah 9

您需要将以下内容添加到 build.gradle 中:

android {
  // ...
  testOptions { 
    unitTests.returnDefaultValues = true
  }
}
Run Code Online (Sandbox Code Playgroud)

dependencies {
//...
    testImplementation 'org.json:json:20180813'
}
Run Code Online (Sandbox Code Playgroud)


ar-*_*r-g 7

我认为你试图运行测试,org.json.JSONObject这是Android Frameworkon pure 的一部分jUnit

从文档:

用于运行单元测试的 android.jar 文件不包含任何实际代码 - 由真实设备上的 Android 系统映像提供。相反,所有方法都会抛出异常(默认情况下)。

我们知道在使用 Log 或 TextUtils 等类时默认行为是有问题的,并将在未来版本中评估可能的解决方案。

您需要模拟可用于此目的的 Android 环境Robolectric或 InstrumentationTests