java - expected=JSONException.class 没有捕捉到

标签 java android json testing robolectric

我做了一个测试,我发送了一个无效的 JSON,它应该会捕捉到一个 JSONException

当我运行测试时,它失败并显示一个 JSONException,为什么测试没有捕获它?

@Test (expected = JSONException.class)
public void testExtraFieldsJsonException() {
    String json = "wrong_data";
    fragment.decodeJson(json);
}

我使用 org.json.JSONException。

测试结果。

org.json.JSONException: Value wrong_data of type java.lang.String cannot be converted to JSONObject
    at org.json.JSON.typeMismatch(JSON.java:111)
    at org.json.JSONObject.<init>(JSONObject.java:158)
    at org.json.JSONObject.<init>(JSONObject.java:171)
    at co.some.mainactivities.ProfileFragment.extraFields(ProfileFragment.java:154)
    at co.some.mainactivities.ProfileFragment.callExtraFields(ProfileFragment.java:243)
    at co.some.mainactivities.TestProfileFragment.testExtraFieldsJsonException(TestProfileFragment.java:41)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.internal.runners.statements.ExpectException.evaluate(ExpectException.java:19)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
    at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:250)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:177)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)

它在 new JSONObject(json);

中失败
private void decodeJson(String json) {
    try {
     JSONObject json = new JSONObject(json);
     int fieldsQuantity = json.getJSONObject("extra_fields").length();
     //....
    }
    catch (JSONException e) {
        e.printStackTrace();
    }
}

最佳答案

您正在捕获 decodeJSON 中的异常,因此它不会传播到测试。

如果您希望将异常抛给 decodeJSON 的调用者,例如您的测试,请移除 try-catch 并将 throws JSONException 添加到函数签名。

关于java - expected=JSONException.class 没有捕捉到,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32287210/

相关文章:

java - Android ASyncTask 在主线程中使用下载的对象

android - 如何在android中的Listview中列出音频文件

jquery - 打开浏览器打印的application/json类型

javascript - Openlayers - 缩放至图层

java - Android:Log Verbose 在 2.2 上针对新字符串 "byte array"初始化抛出错误

java - 将 Spark DataFrame 转换为 Pojo 对象

android - 从 URL 获取图像

javascript - 如何从 Google Spreadsheet JSON feed 获取特定属性

java - Getter 用于在 dynamoDB 中增值

java - 如何在 JPanel 中创建带边框单元格的 JTable?