2015-11-12 17 views
5

Nel mezzo di un metodo che sto facendo qualcosa di simileCome simulare JSONObject?

JSONObject = new JSONObject(json); 

Ora sto cercando di unit test che l'utilizzo Android Studio e JUnit. Purtroppo, Android Studio non mi consente di creare una vera istanza JSONObject e mi chiede di deriderlo.

Qual è il modo più semplice per conservare quel codice e poter eseguire il test dell'unità?

Mockito non mi aiuterà poiché non è in grado di simulare i costruttori, ma sembra che sia PowerMock la strada da percorrere.

+0

Penso che la risposta alla tua domanda è qui: http://stackoverflow.com/a/35675861/3032209 –

risposta

4

Ho finalmente utilizzato Roboelectric. Ti permette di eseguire test simulando le condizioni reali del dispositivo. Ciò rende superfluo l'uso di classi di framework.

solo bisogno di aggiungere roboelectric riferimento alla Gradle e decorare le mie classi di test con @RunWith(RobolectricTestRunner.class)

+1

Grazie! 'testCompile 'org.robolectric: robolectric: 2.1.1'' esempio gradle –

1

è possibile creare un JSONObject finto con il semplice codice

JSONObject mock = Mockito.mock(JSONObject.class); 

Allora si può facilmente deridere è metodi come i getter di campo, per essere in grado di restituire quello che vuoi dalla JSONObject.

Se il problema è che questo JSONObject viene creato nel mezzo di una funzione lunga, è possibile estrarre la creazione di JSONObject in un collaboratore e quindi prendere in giro il collaboratore.

MyClass { 
    MyClass(JSONObjectCreator creator) { 
     this.creator = creator; 
    } 
    public void doesSomethingWithJSON(String input) { 
     //... 
     JSONObject jsonObject = creator.createJSONObject(input); 
     //... 
    } 
} 
JSONCreator { 
    public JSONObject createJSONObject(String input) { 
     return new JSONObject(input); 
    } 
} 

nel test si creerebbe un JSONObject finto, e una nuova MyClass con JSONObjectCreator deriso. Il matto JSONObjectCreator restituirebbe il falso JSONObject.

+0

so di poter iniettare una fabbrica, ma non per evitarlo se possibile. Grazie – StackOverflower

+0

Cosa stai cercando di realizzare? Ho suggerito due modi per creare mock. Non sono sicuro di ciò che desideri o del tuo test, né del perché vuoi evitare di iniettare una fabbrica. –

+0

Non voglio creare una factory per ogni componente di framework che voglio creare. Voglio solo iniettare una simulazione sulla chiamata del costruttore come spiegato sulla domanda. Grazie – StackOverflower