user1634451
user1634451

Reputation: 5212

Android unit test not mocked

I followed this guide but I am stuck with this error:

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.

I modified by Gradle build like the guide says but it doesn't make a difference

testOptions { 
    unitTests.returnDefaultValues = true
}

Upvotes: 66

Views: 32405

Answers (5)

Reza
Reza

Reputation: 4773

Solution for the problem in if you're using Kotlin DSL:

testOptions {
    unitTests.isReturnDefaultValues = true
}

testImplementation("org.json:json:20210307")

Upvotes: 1

Ben Pearson
Ben Pearson

Reputation: 7752

JSON is bundled up with the Android SDK, so you'll just be hitting a stub. You can pull in a JSON jar, which will provide real objects to use.

To do this, you'll need to add this to your build.gradle:

testImplementation 'org.json:json:20140107'

Alternatively, you can download and include the jar.

testCompile files('libs/json.jar')

Note that the latest version of JSON is built for Java 8, so you'll need to grab 20140107 You may also need to clean and rebuild the project.

Upvotes: 138

Thiago
Thiago

Reputation: 13302

You need to add the following to the build.gradle:

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

and

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

Upvotes: 10

Son Nguyen Thanh
Son Nguyen Thanh

Reputation: 1209

android {


testOptions {
    unitTests.returnDefaultValues = true
} }

dependencies {
testImplementation libs.leakCanaryNoOp
testImplementation tests.jUnit
testImplementation tests.mockito
testImplementation(tests.mokitoKotlin) {
    exclude group: "org.jetbrains.kotlin", module: "kotlin-stdlib"
    exclude group: "org.jetbrains.kotlin", module: "kotlin-runtime"
    exclude group: "org.jetbrains.kotlin", module: "kotlin-reflect"
    exclude group: "org.mockito", module: "mockito-core"
}
testImplementation tests.powerMock
testImplementation tests.powerMockApiMockito
testImplementation (tests.robolectric) {
    exclude group: 'org.robolectric', module: 'robolectric-resources:'
}
testImplementation (tests.robolectricShadowsSupport){
    exclude group: 'org.robolectric', module: 'robolectric'
}
kaptTest libs.daggerCompiler

}

Upvotes: -2

ar-g
ar-g

Reputation: 3495

I think you trying to run tests with org.json.JSONObject which is part of Android Framework on pure jUnit.

From docs:

The android.jar file that is used to run unit tests does not contain any actual code - that is provided by the Android system image on real devices. Instead, all methods throw exceptions (by default).

We are aware that the default behavior is problematic when using classes like Log or TextUtils and will evaluate possible solutions in future releases.

You need to emulate Android environment you can use for this purpose Robolectric or InstrumentationTests

Upvotes: 10

Related Questions