【发布时间】:2015-12-13 05:22:34
【问题描述】:
我在一个类里面有这个方法,它将类的属性序列化到一个JSONObject中,很简单:
public String serialize(){
JSONObject wifiToAddJson = null;
try {
wifiToAddJson = new JSONObject();
wifiToAddJson.put("wifi_ssid", wifi_ssid);
wifiToAddJson.put("wifi_password", wifi_password);
wifiToAddJson.put("latitude", wifi_LatLng.latitude);
wifiToAddJson.put("longitude", wifi_LatLng.longitude);
wifiToAddJson.put("name", name);
} catch (JSONException e) {
ACRA.getErrorReporter().handleSilentException(new MyJSONException(TAG + e.getMessage()));
}
return wifiToAddJson.toString();
}
我想通过询问所有字段的值来测试这种方法是否可以。 我想通过这样的测试来做到这一点:
@Test
public void testSerialize(){
String wifiSerialized = wiFiToAdd.serialize();
try {
JSONObject jsonObject = new JSONObject(wifiSerialized);
String ssid = (String) jsonObject.get("wifi_ssid");
String password = (String) jsonObject.get("wifi_password");
String name = (String) jsonObject.get("name");
String latitude = (String) jsonObject.get("latitude");
String longitude = (String) jsonObject.get("longitude");
assertEquals("WIFI_TEST", ssid);
assertEquals("wifiTest", password);
assertEquals("WiFi Pruebas", name);
assertEquals("40.420088", latitude);
assertEquals("-3.688810", longitude);
} catch (JSONException e) {
e.printStackTrace();
}
}
但是问题来了:
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.
at org.json.JSONObject.put(JSONObject.java)
at com.wiffinity.easyaccess.model.wifi.WiFiToAdd.serialize(WiFiToAdd.java:32)
at com.wiffinity.easyaccess.model.wifi.WiFiToAddTest.testSerialize(WiFiToAddTest.java:28)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:79)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:78)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Process finished with exit code -1
谷歌文档说:
用于运行单元测试的 android.jar 文件不包含任何实际代码 - 由真实设备上的 Android 系统映像提供。相反,所有方法都会抛出异常(默认情况下)。这是为了确保您的单元测试仅测试您的代码,而不依赖于 Android 平台的任何特定行为(您没有明确模拟,例如使用 Mockito)。如果这证明有问题,您可以将下面的 sn-p 添加到您的 build.gradle 以更改此行为:
android {
// ...
testOptions {
unitTests.returnDefaultValues = true
}
}
我不想改变我的测试的整体行为。如何以干净的方式测试该方法而不改变测试的行为?
【问题讨论】:
-
我想你的问题的答案在这里:stackoverflow.com/a/35675861/3032209
标签: java android unit-testing