2013-12-09 10 views
9

Ho un normale caso di test JUnit che verifica la logica del metodo non-android. Il metodo usa TextUtils per cose come TextUtils.isEmpty().Test unità Android - Best practice quando il codice fa riferimento alle classi Android

Non ha senso per me creare un dispositivo AndroidTestCase solo per inserire la classe TextUtils. C'è un modo migliore per strumentare questo test unitario? Come aggiungere un android.jar al progetto di test o qualcosa del genere?

Situazione simile con un altro test in cui voglio simulare un oggetto Contesto. Non riesco a deriderlo senza estendere AndroidTestCase. Qual è la migliore pratica in queste situazioni in cui sto solo cercando di testare la logica non-android e non voglio che funzioni su un emulatore, ma tocca alcune classi di Android?

Grazie

+0

Che cosa si intende per " meglio "e" meglio "qui? –

+0

Quindi, in pratica, vuoi scrivere casi di test senza eseguire l'app sull'emulatore? – user2511882

risposta

3

Forse dare un'occhiata al http://robolectric.org/

Si prende in giro la maggior parte del SDK di Android in modo da test possono essere eseguiti in puro Java. Ciò significa che possono essere eseguiti molto più velocemente in una normale VM desktop.

Con questo tipo di velocità, test driven sviluppo diventa possibile.

5

Hai due opzioni per eseguire test per il tuo codice Android. La prima è l'opzione di test strumentata in cui è possibile testare il codice collegando un adb al proprio sistema.

Il secondo e più funzionale è JUnit Testing, in cui viene testata solo la classe Java e vengono derisi tutti gli altri contenuti relativi a Android.

Usa PowerMockito

Aggiungere questo sopra il nome della classe, e includere altri nomi di classi CUT (classi in prova)

@RunWith(PowerMockRunner.class) 
@PrepareForTest({TextUtils.class}) 
public class ContactUtilsTest 
{ 

aggiungere questo alla tua @Before

@Before 
public void setup(){ 
PowerMockito.mockStatic(TextUtils.class); 
mMyFragmentPresenter=new MyFragmentPresenterImpl(); 
} 

Questo renderà PowerMockito i valori predefiniti di ritorno per i metodi all'interno di TextUtils

Per esempio diciamo che l'implementazione sta verificando se una stringa è vuota o non allora, nella vostra @Test

when(TextUtils.isEmpty(any(CharSequence.class))).thenReturn(true); 
//Here i call the method which uses TextUtils and check if it is returning true 
assertTrue(MyFragmentPresenterImpl.checkUsingTextUtils("Fragment"); 

Si dovrà anche aggiungere i depedencies Gradle rilevanti

testCompile "org.powermock:powermock-module-junit4:1.6.2" 
testCompile "org.powermock:powermock-module-junit4-rule:1.6.2" 
testCompile "org.powermock:powermock-api-mockito:1.6.2" 
testCompile "org.powermock:powermock-classloading-xstream:1.6.2" 
Problemi correlati