2015-11-08 30 views
6

Ich habe ein Problem mit JSONObject verbunden.UnitTest JSONObject zeigt null

Das Problem ist, wenn ich diesen Test debuggen, es zeigt, dass nichts zu JSON Objekt gestellt wird.

json={[email protected]} "null"

ich alles überprüft und ich habe keine Ahnung, warum dies geschieht. JSONObject funktioniert gut in der App. Es passiert nur beim Testen.

PS. Ich habe in build.gradle hat dieses

testOptions { 
     unitTests.returnDefaultValues = true 
     } 
+0

Wohin führen Sie die Tests? Am PC oder am Gerät/Simulator? – hgoebl

+0

Ich benutze PC Ich denke, weil es keinen Bildschirm gibt, Gerät zu wählen – wacik93

+0

Solche Tests funktionieren nicht auf PC mit android.jar. 'android.jar' enthält nur Signaturen von Klassen, nicht die Implementierung. Führen Sie die Tests auf dem Gerät aus. – hgoebl

Antwort

4

Es gibt 2 Arten von Unit-Tests in Android:

  • instrumentierte (langsam und Sie ein Gerät oder Emulator benötigen)
  • Nicht -instrumentiert oder lokal (schnell und Sie können sie auf der JVM auf Ihrem Computer ausführen)

Wenn Ihre Unit-Tests Klassen durch das Android SDK verwenden (wie die JSONObject oder Context), werden Sie zwischen wählen:

  • machen den Test einer instrumentierten Test

OR

Sie haben mehr nützliche Informationen zu diesem Thema in this Post.

By the way, in der Post, den Sie einen Trick lernen, um Ihren JSONObject Unit-Test zu einem nicht-instrumentierte Test konvertieren, die Sie auf Ihrem lokalen JVM (ohne Roboelectric) ausführen können

+0

Beitrag war großartig, JSON mit lokalen JVM nur zu Testzwecken zu verwenden! – JCricket

1

Sie Mockito verwenden können Mache JSONObject und gib das von dir benötigte JSON-Objekt zurück.

Beispiel:

@Test 
public void myTest(){ 

     JsonHttpResponseHandler handler = myClassUnderTest.getHandlerForGetCalendar(testFuture); 
     JSONObject successResp = Mockito.mock(JSONObject.class); 
     JSONArray events = Mockito.mock(JSONArray.class); 
     JSONObject event = Mockito.mock(JSONObject.class); 

    try{ 
    doReturn("Standup meeting with team..") 
    .when(event).getString("Subject"); 

    doReturn("id_") 
    .when(event).getString("Id"); 

    doReturn(1) 
    .when(events).length(); 

    doReturn(event) 
    .when(events).getJSONObject(0); 

    doReturn(events) 
    .when(successResp).getJSONArray("value"); 

    handler.onSuccess(200, null, successResp); 

    }catch(Exception xx){ 
    JSONObject errorResp = null; 
    try{ 
     errorResp = new JSONObject("{}"); // this will be null but it's fine for the error case.. 
    }catch(JSONException ex){ 
     throw new IllegalStateException("Test Exception during json error response construction. Cause: "+ex); 
    } 
    handler.onFailure(500, null, new IllegalStateException("Something went wrong in test helper handlerForGetCalendarOnSuccess. Cause: "+xx), errorResp); 
    } 

    // Assertions you need .. 

}

5

TL; DR-Version von Yair Kukielka Antwort ...

diese zu Ihrer build.gradle Datei hinzufügen, wie

vorgeschlagen (vielen Dank!)
testCompile "org.json:json:20140107" 

Dies wird die stubbed Android-Bibliothek durch eine, die auf dem Desktop funktioniert ersetzen .