Android StudioでJSONObjectを使用したUTでハマりました。
下記のUTを実行すると。。。
JSONObjectTest.java
public class JSONObjectTest {
@Test
public void testJsonObject() throws JSONException {
JSONObject json = new JSONObject();
json.put("key", "value");
// 説明のため、簡単なテスト内容にしています
assertEquals("value", json.get("key"));
}
}
RuntimeExceptionが発生します。
java.lang.RuntimeException: Method put in org.json.JSONObject not mocked. See http://g.co/androidstudio/not-mocked for details.
これは、UTを実行するために使用されるandroid.jarには、実際のコードが含まれていないためです。
そして、上記のメッセージ通りに対応すると。。。
build.gradle
android {
// 下記を追加
testOptions {
unitTests.returnDefaultValues = true
}
}
テストが失敗します。
java.lang.AssertionError:
Expected :value
Actual :null
これは、returnDefaultValuesをtrueにすると、RuntimeExceptionの代わりに、default値(null/0)を返すためです。
mockすることも可能ですが、UTの際はjavaのorg.jsonを使用することで対応が出来ます。
build.gradle
dependencies {
// 下記を追加
testImplementation 'org.json:json:20180130'
}