2015-05-19 5 views
21

Ich muss eine App mit SQLite-Nutzung erstellen. Jetzt möchte ich meine Komponententests schreiben. Diese Komponententests sollten meine Klasse SQLiteBridge testen. SQLiteBridge bietet DAOs für jede untergeordnete Klasse von Model.Android JUnit4 Testing - Woher kommt der Kontext?

Jetzt habe ich das Problem, dass ich einen Kontext brauche, um meine SQLiteBridge zu erstellen. SQLiteBridge erstellt und behandelt eine SQLite-Datenbank auf dem System ..

Woher bekomme ich das Context-Objekt?

Mein Setup ist wie hier (also verwende ich junit4 [Danke, Gott]): http://tools.android.com/tech-docs/unit-testing-support

EDIT: Ich hoffe, es ist eine Art und Weise, wie die alten AndroidTestCase, ohne zu verlieren junit4 zu verlängern. :)

Antwort

50

Wie hier beschrieben: https://code.google.com/p/android-test-kit/wiki/AndroidJUnitRunnerUserGuide Verwenden Sie die InstrumentationRegistry den Kontext zu erhalten.

Wenn Sie jedoch InstrumentationRegistry.getContext() direkt anrufen, erhalten Sie möglicherweise eine Ausnahme beim Öffnen Ihrer Datenbank. Ich glaube, das liegt daran, dass der von getContext() zurückgegebene Kontext auf den Kontext der Instrumentierung verweist und nicht auf den des Anwendungs ​​/ Komponententests. Statt InstrumentationRegistry.getInstrumentation().getTargetContext()

Zum Beispiel verwenden:

@RunWith(AndroidJUnit4.class) 
public class SqliteTest { 

    Context mMockContext; 

    @Before 
    public void setUp() { 
     mMockContext = new RenamingDelegatingContext(InstrumentationRegistry.getTargetContext(), "test_"); 
    } 
} 

Die RenamingDelegatingContext Präfixe einfach die Datei/Datenbanknamen mit test_ Sie verhindern, dass Daten zu überschreiben, die Sie in dem gleichen Simulator haben.

+0

Ich habe es gerade versucht und es hat funktioniert! Ich denke, ich werde Robolectric verwenden .. aber danke für diese Lösung! :) –

+0

Ich habe das versucht und es funktioniert, aber das Präfix wird ignoriert und somit wird die "echte" Datenbank im Test verwendet. Irgendwelche Ideen, warum dies passieren könnte? – moarCoffee

+3

InstrumentationRegistry kann nicht als Symbol aufgelöst werden –