2015-05-19 27 views
21

Muszę zbudować aplikację z wykorzystaniem sqlite. Teraz chcę napisać moje testy jednostkowe. Te testy jednostkowe powinny przetestować moją klasę SQLiteBridge. SQLiteBridge zapewnia DAO dla każdej klasy dziecka Modelu.Testowanie Androida JUnit4 - skąd wziąć kontekst?

Teraz mam problem, że potrzebuję kontekstu, aby utworzyć mój SQLiteBridge. SQLiteBridge tworzy i obsługuje bazę danych SQLite w systemie.

Skąd pobrać obiekt kontekstowy?

Moja konfiguracja jest jak tutaj (tak używam Junit4 [dzięki Bogu]): http://tools.android.com/tech-docs/unit-testing-support

EDIT: Mam nadzieję, że istnieje sposób, jak stary AndroidTestCase przedłużyć bez utraty Junit4. :)

Odpowiedz

50

Zgodnie z opisem tutaj: https://code.google.com/p/android-test-kit/wiki/AndroidJUnitRunnerUserGuide Skorzystaj z Instrumentation Registered, aby uzyskać kontekst.

Jeśli jednak zadzwonisz na numer InstrumentationRegistry.getContext(), możesz uzyskać wyjątek otwierający bazę danych. Wierzę, że dzieje się tak dlatego, że kontekst zwrócony przez getContext() wskazuje na kontekst oprzyrządowania, a nie na test aplikacji/jednostki. Zamiast używać InstrumentationRegistry.getInstrumentation().getTargetContext()

Na przykład:

@RunWith(AndroidJUnit4.class) 
public class SqliteTest { 

    Context mMockContext; 

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

RenamingDelegatingContext prostu poprzedza nazwy pliku/bazy danych z test_ uniemożliwić nadpisywania danych, które możesz mieć w tym samym symulatorze.

+0

Po prostu wypróbowałem i zadziałało! Myślę, że użyję Robolectric .. ale dzięki za to rozwiązanie! :) –

+0

Próbowałem tego i działa, ale prefiks jest ignorowany, a więc "prawdziwa" baza danych jest używana w teście. Jakieś pomysły na to, dlaczego tak się dzieje? – moarCoffee

+3

InstrumentationRegistry nie może być rozpoznany jako symbol –