2015-11-08 9 views
6

Mam problem związany z JSONObject.UnitTest JSONObject pokazuje zero

@Test 
public void toUrlTest() throws JSONException { 
    String url; 

    JSONObject json = new JSONObject(); 

    json.put"id", 1); 
    json.put("email", "[email protected]"); 
    url = JSONParser.toURLString(json); 

    assertEquals("id=1&[email protected]", url); 

} 

Problem polega na tym, że debuguję ten test, pokazuje on, że nic nie jest umieszczane w obiekcie JSON.

json={[email protected]} "null"

Sprawdziłem wszystko i nie mam pojęcia, dlaczego tak się stało. JSONObject działa dobrze w aplikacji. Dzieje się tak tylko podczas testów.

PS. Dodałem w build.gradle to

testOptions { 
     unitTests.returnDefaultValues = true 
     } 
+0

Gdzie przeprowadzasz testy? Na PC lub na urządzeniu/symulatorze? – hgoebl

+0

Używam komputera, chyba że nie ma ekranu do wyboru urządzenia – wacik93

+0

Takie testy nie działają na PC z android.jar. 'android.jar' zawiera tylko podpisy klas, a nie implementację. Uruchom testy na urządzeniu. – hgoebl

Odpowiedz

4

Istnieją 2 rodzaje testów jednostkowych w Androidzie:

  • instrumentalnej (powolny i trzeba urządzenie lub emulator)
  • Non -instrumentowane lub lokalne (szybko i można je wykonać na maszynie JVM na komputerze)

Jeśli testy jednostkowe używać klas przedstawionych przez SDK Androida (jak JSONObject lub Context), będziesz musiał wybrać pomiędzy:

  • podejmowaniu testu oprzyrządowanego test

OR

Masz więcej przydatnych informacji na ten temat w poście this.

Nawiasem mówiąc, w poście dowiesz trick do konwersji testów jednostkowych JSONObject do non-instrumentalnej testu, który można wykonać w lokalnej JVM (bez Roboelectric)

+0

Post był świetny do używania jsona z lokalną maszyną JVM tylko do celów testowych! – JCricket

1

Można użyć do Mockito mock JSONObject i zwróć obiekt JSON, którego potrzebujesz.

Przykład:

@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 wersja odpowiedzi Yair Kukiełka ...

Dodaj do tego pliku build.gradle, jak sugeruje

(dzięki!)
testCompile "org.json:json:20140107" 

Spowoduje to zastąpienie usuniętej biblioteki Androida tym, które działa na pulpicie .