2011-11-10 10 views
12

Ho una libreria Java che utilizza alcune cose dalle API di Android. Mi piacerebbe usare Mockito per scrivere test unitari per questa libreria.Android: unità di test delle applicazioni Android con Robolectric e Mockito

C'è un modo per andare su questo?

Mockito non giocare piacevole sulla Dalvik VM, vedi questo post: Using Mockito with Android virtual machine

UPDATE:

Dato questo post ho scoperto Robolectric, e ho avuto l'opportunità di lavorare da Pivotal Labs e apportare alcuni piccoli contributi a questa libreria. Vorrei raccomandare l'utilizzo di questo oltre il framework di test Android/mockito. Inoltre, sei libero di usare Robolectric AND Mockito, ma gli oggetti ombra in Robolectric rendono Mockito non necessario per la maggior parte dei casi d'uso.

Il problema con il tentativo di test di unità Android è che la libreria Android che si costruisce su ogni metodo ha spense a uno un'eccezione stub, o tornare null. Se vuoi testare la tua app e desideri il comportamento di Android, sei fuori di sorte, a meno che non usi Robolectric che riscrive il codice byte al volo quando le classi si caricano e inietta un oggetto ombra che simula il comportamento.

UPDATE 2:

E 'stato un po' e le cose sono cambiate. Molte delle classi Shadow in Robolectric sono state sostituite con le vere classi Android. I veri e propri giare Android sono ora usati e Robolectric carica solo classi Shadow per un insieme di cose molto più piccolo. Questo è ancora più un motivo per usare Robolectric per i tuoi test su Android.

risposta

9

Dopo tanto google, ho trovato una risposta per questo here.

In pratica si tratta di utilizzare il framework di test dell'unità Robolectric, che intercetta il caricamento delle classi Android. Puoi quindi andare avanti e usare Mockito (anche se non è necessario nella maggior parte dei casi) ed eseguire i test sulla JVM!

+0

Uso il costrutto-spia di Mockito in combinazione con i costruttori forniti da Robolectric. In questo modo posso eseguire il deridere parziale dei componenti di Android quando necessario, ad es. FooActivity foo = spy (Robolectric.buildActivity (FooActivity.class) .get()); doReturn (mock) .when (foo) .getSomething(); – Alix

1

Dai uno sguardo allo android-mock. È basato su EasyMock 2.4 (quindi non abbastanza bello come Mockito ma chiuso).

Ottiene i limiti del DalvikVM pre-generando le classi di simulazione in fase di produzione piuttosto che in fase di esecuzione, quindi raggruppandole con il codice di test compilato durante la distribuzione sul dispositivo.

C'è anche una struttura di simulazione chiamata Borachio che non posso garantire, ma sembra promettente (se sei felice di fare i passi per far funzionare Scala sul tuo dispositivo).

+0

Sì, so di quello. Sto cercando di evitare di usarlo se non dovessi farlo. La sintassi su Mockito è molto più bella. –

1

È possibile evitarlo, per tutto ciò che non ha nulla a che fare con le classi interne di Android SDK. Questo è quello che sto facendo per i miei progetti Android (anche se io uso JMock2, non Mockito).

Ho due progetti di test.

  • Il primo si usa JUnit4 e JMock2 che io ho aggiunto come dipendenze. Metto alla prova tutte le classi di "business logic", ma non riesco a testare nulla che abbia a che fare con Android (classi UI, SQLiteOpenHelper, ecc.). Se provo a usarli nei miei test, ottengo l'temuta eccezione Stub!.

  • Il secondo per testare l'interfaccia utente, utilizzando ActivityInstrumentationTestCase2 e Robotium.

Questo può sembrare un sacco di lavoro e complesso, ma in realtà non lo è, e in realtà penso sia meglio separarli.I test dell'interfaccia utente non sono "reali" unit-test e spesso verificano alcune funzionalità su più unità. Se separi correttamente il tuo livello di interfaccia utente dalla tua logica di business (e questa separazione dei test ti costringerà a farlo, in stile TDD), allora è tutto bello e scorrevole.

+0

Sigh. Il problema è che le mie classi di modelli di business utilizzano AsyncTask per catturare tutti i dati che sto utilizzando nell'app, su ogni pagina. Stavo pensando, dal momento che AsyncTask è fondamentalmente un POJO che potrei semplicemente prendere il codice e metterlo nel mio progetto e perdere la dipendenza. –

+0

Se fossi in te, tenterei di astrarre tutte le dipendenze di Android dalle interfacce, in modo che lo stub non interferisse. Probabilmente non è così facile come sembra con AsyncTask ... – Guillaume

+0

@Chirstopher Perry: hai avuto qualche soluzione del tuo problema per testare efficacemente i compiti di ASync? Sono un po 'sulla stessa barca ora. – bianca

2

A partire dalla versione 1.9.5 (rilasciata il 3 giugno 2012) è possibile utilizzare Mockito con Android. Per fare questo si richiederà anche dexmaker:

pagina

http://code.google.com/p/dexmaker/

Questo wiki descrive come implementarlo:

http://code.google.com/p/dexmaker/wiki/Mockito

+0

Questo non ti dà alcun comportamento Android. Robolectric è ancora la scelta migliore, poiché fornisce Mock (le classi shadow) e il comportamento di Android. –

+2

Capisco, ma la tua domanda non era "qual è il miglior quadro di derisione per Android", ma "come posso usare Mockito con Android". –

+0

@ChristopherPerry Penso che in realtà ci possa essere una certa confusione. Utilizzando Mockito in questo modo con il framework di testing di Android e JUnit, i test vengono eseguiti su un dispositivo reale o sull'emulatore, il che significa che sono disponibili tutte le classi di Android. Il framework di testing di Android fornisce anche mock integrati, come 'MockContext'. –