2015-08-29 3 views
0

Я сделал тест, где я отправляю недействительный JSON, и он должен поймать меня JSONException.expected = JSONException.class не улавливает

Когда я запускаю тест, он терпит неудачу и показывает мне 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

не могли бы вы отправить тело метода фрагмента.decodeJson()? – Rehman

+0

Я просто редактирую свой вопрос. –

Смежные вопросы