2015-02-04 11 views
10

Ich habe eine Android-App, die ORMLite/SQLite verwendet, und ich verwende Robolectric in Verbindung mit JUnit 4, damit ich Komponententests in Android Studio und auf einem Jenkins-Build-Server ausführen kann.Woher weiß ich, ob meine App mit Robolectric läuft?

Normalerweise würde ich Testdaten in meinen Tests einrichten, im Setup, und dann meine Testszenarien dagegen laufen lassen, aber als ich das versuchte, bekam ich Probleme und Ausnahmen, die mit Dateien zu tun haben, die gesperrt wurden und das scheint ein Problem zu sein, das andere hatten ... also was ich bis jetzt getan habe, ist die create database-Methode in meinem Datenbankhelfer zu verwenden, um einige Dummy-Daten zu erstellen, die die Tests dort erwarten.

Das Problem ist, dass meine Anwendung jetzt in eine echte Datenbank eingesteckt werden muss und ich kann nicht Dummy-Daten einrichten, wenn es ausgeführt wird.

Gibt es einen Weg, innerhalb meiner Datenbank Helper-Klasse zu erkennen, ob der Code auf einem Gerät oder in Robolectric ausgeführt wird?

Antwort

1

Zunächst möchte ich sagen, dass Sie keinen Code setzen sollten, um Dummy-/Testdaten im normalen freigebbaren Code zu initialisieren und im Allgemeinen sollten Sie nicht von der Haupt-App wissen müssen, wenn Sie drin sind ein Robo-Lauf oder nicht.

Jetzt Vergangenheit die rechtlichen Hinweise zu bewegen und Ihre Frage zu beantworten eigentlich ... Eine Möglichkeit, um dies könnte, ist wie dieser ein „Testapplication“ Dann schaffen

public boolean isRoboTestRun() { 
    return false; 
} 

ein Verfahren in Ihrer Anwendungsklasse haben, in der Testpaket, das Ihre normale Anwendung erweitert und diese Methode auf return true überschreibt. Es ist hacky, aber das ist, weil es nicht wirklich so funktionieren soll :)

+1

ich mit einer Variation dieser endete. Ich habe eine alternative Datenbankhilfsklasse in der Testquelle erstellt, die die in der Hauptquelle überschreibt. –

+0

Das ist wahrscheinlich eigentlich besser :) –

0

Irgendwann müssen Sie init OrmLiteSqliteOpenHelper mit Ihrer Context init.

Nehmen wir an, Sie tun dies in Ihrer Anwendungsklasse in onCreate. Erstellen Sie einfach Test<your application class name> in Ihren Testquellen und überschreiben Sie onCreate mit leerer Implementierung.

Robolectric wird diese Klasse finden und während der Tests verwenden. Mehr Details here.

18

das ist, was gut für mich auf Robolectric arbeitet 3.

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