2015-02-04 8 views
10

Ho un'app per Android che utilizza ORMLite/SQLite e uso Robolectric in combinazione con JUnit 4 per permettermi di eseguire i test di unità in Android Studio e su un server di build Jenkins.Come faccio a sapere se la mia app è in esecuzione con Robolectric?

In genere installavo i test nei miei test, nel setup, quindi eseguivo i miei scenari di test contro di esso ma quando ho provato a farlo ho iniziato a ricevere problemi ed eccezioni che sembravano essere legate a file bloccati o qualcosa del genere e questo sembra essere un problema che altri hanno avuto ... quindi quello che ho fatto fino ad ora è usare il metodo di creazione del database nel mio helper del database per creare alcuni dati fittizi che i test si aspettano di essere lì.

Il problema è che ora la mia applicazione deve collegarsi a un vero database e non posso averlo configurare i dati fittizi durante l'esecuzione.

Se esiste un modo, all'interno della classe helper del database, per rilevare se il codice è in esecuzione su un dispositivo o in Robolectric?

risposta

1

Per cominciare, dirò che non dovresti inserire il codice per inizializzare i dati fittizio/test nel normale codice rilasciabile e in generale non dovresti aver bisogno di sapere dall'app principale se ti trovi una corsa robo o no.

ora spostando oltre la dichiarazione di non responsabilità e di rispondere realmente alla tua domanda ... Un modo possibile per questo è di avere un metodo nella classe domanda come questa

public boolean isRoboTestRun() { 
    return false; 
} 

Quindi creare un "TestApplication" nel pacchetto di test che estende la normale applicazione e sostituisce questo metodo a return true. È hacky, ma è perché non è pensato per funzionare in questo modo :)

+1

ho finito con una variazione su questo. Ho creato una classe helper di database alternativa nella sorgente di test che sovrascrive quella nella fonte principale. –

+0

Probabilmente è meglio in realtà :) –

0

A un certo punto devi avviare OrmLiteSqliteOpenHelper con il tuo Context.

Supponiamo di farlo nella classe di applicazione in onCreate. Quindi crea solo Test<your application class name> nelle origini dei test e sostituisci onCreate con un'implementazione vuota.

Robolectric troveranno questa classe e verranno utilizzati durante i test. Maggiori dettagli here.

18

Questo è ciò che funziona bene per me su Robolectric 3.

public static boolean isRoboUnitTest() { 
    return "robolectric".equals(Build.FINGERPRINT); 
}