2015-08-29 134 views
0

我做了一個測試,發送了一個無效的JSON,它應該能幫我找到一個JSONExceptionexpected = JSONException.class does not catch

當我運行測試時,它失敗並顯示我一個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(); 
    } 
} 

回答

2

您正在捕捉decodeJSON中的例外,因此它不會傳播到測試中。

如果您希望例外情況發生在decodeJSON的調用者(例如您的測試)中,請刪除try-catch並將throws JSONException添加到函數簽名中。

+0

謝謝,它工作。 –

0

失敗,這是一個預期的行爲。但是應該通過測試用例。它失敗了嗎?

+0

是的,這是失敗的。 –

+0

可否請您發佈fragment.decodeJson()方法的正文? – Rehman

+0

我只是編輯我的問題。 –