12

Próbuję przetestować działanie z Mockito & Dagger. Byłem w stanie wstrzyknąć zależności do Aktywności w mojej aplikacji, ale podczas testowania Aktywności nie byłem w stanie wstrzyknąć próbnego działania. Czy powinienem wstrzykiwać Activity, aby przetestować lub pozwolić, aby getActivity() go utworzył?Testowanie funkcjonalności Androida za pomocą sztyletu

public class MainActivityTest extends 
    ActivityInstrumentationTestCase2<MainActivity> { 

@Inject Engine engineMock; 
private MainActivity mActivity; 
private Button mLogoutBtn; 


public MainActivityTest() { 
    super(MainActivity.class); 
} 

@Override 
protected void setUp() throws Exception { 
    super.setUp(); 

    // Inject engineMock to test 
    ObjectGraph.create(new TestModule()).inject(this); 
} 

@Override 
protected void tearDown() { 
    if (mActivity != null) 
     mActivity.finish(); 
} 

@Module(
includes = MainModule.class, 
entryPoints = MainActivityTest.class, 
overrides = true 
) 

static class TestModule { 
    @Provides 
    @Singleton 
    Engine provideEngine() { 
     return mock(Engine.class); 
    } 
} 

@UiThreadTest 
public void testLogoutButton() { 

    when(engineMock.isLoggedIn()).thenReturn(true); 

    mActivity = getActivity(); 
    mLogoutBtn = (Button) mActivity.findViewById(R.id.logoutButton); 

    // how to inject engineMock to Activity under test? 
    ObjectGraph.create(new TestModule()).inject(this.mActivity); 

    assertTrue(mLogoutBtn.isEnabled() == true); 
} 
} 

Odpowiedz

1

Zrobiłem więcej eksperymentów i dowiedziałem się, że Sztylet nie jest w stanie prawidłowo utworzyć aktywności, gdy zostanie wstrzyknięty do testu. W nowej wersji testu testDoSomethingCalledOnEngine przechodzi, ale onCreate nie jest wywoływany na MainActivity. Drugi test, testDoSomethingUI kończy się niepowodzeniem i istnieją w rzeczywistości dwa wystąpienia MainActivity, onCreate zostaje wywołany do drugiej instancji (stworzonej przez ActivityInstrumentationTestCase2 I quess), ale nie do drugiej. Może programiści z Square zastanawiali się tylko nad testowaniem Aktywności za pomocą Robolectric zamiast testu oprzyrządowania Androida?

public class MainActivityTest extends 
    ActivityInstrumentationTestCase2<MainActivity> { 

@Inject Engine engineMock; 
@Inject MainActivity mActivity; 

public MainActivityTest() { 
    super(MainActivity.class); 
} 

@Override 
protected void setUp() throws Exception { 
    super.setUp(); 

    // Inject engineMock to test & Activity under test 
    ObjectGraph.create(new TestModule()).inject(this); 
} 


@Module(
includes = MainModule.class, 
entryPoints = MainActivityTest.class, 
overrides = true 
) 

static class TestModule { 
    @Provides 
    @Singleton 
    Engine provideEngine() { 
     return mock(Engine.class); 
    } 
} 

public void testDoSomethingCalledOnEngine() { 
    when(engineMock.isLoggedIn()).thenReturn(true); 
    mActivity.onSomethingHappened(); 
    verify(engineMock).doSomething(); 
} 

@UiThreadTest 
public void testDoSomethingUI() { 
    when(engineMock.isLoggedIn()).thenReturn(true); 
    mActivity.onSomethingHappened(); 
    Button btn = (Button) mActivity.findViewById(R.id.logoutButton); 
    String btnText = btn.getText().toString(); 
    assertTrue(btnText.equals("Log out")); 
} 

}

+3

Nasze działania wstrzykiwać sobie w onCreate (w klasie bazowej). Dodajemy moduły przeznaczone tylko dla użytkowników do wykresu obiektów za pomocą wersji rozwojowej klasy aplikacji. –

+5

@JakeWharton możesz wskazać przykład, w którym Sztylet wstrząsa mockami przy pomocy testów ui? Wiem od kilku wtyczek, które stworzyłeś, które pracowałyście z Espresso. Przykład, w jaki sposób osiągniesz testowe testy do testów espresso, byłby nieoceniony! –

6

użyć Mockito oraz Dagger do testów funkcjonalnych. Kluczową koncepcją jest to, że twoja klasa testowa dziedziczy po ActivityUnitTestCase zamiast ActivityInstrumentationTestCase2; ta ostatnia super klasy metoda call onStart() cyklu życia Activity blokuje ci możliwość wstrzyknięcia testu podwaja zależności, ale z pierwszą superklasą możesz obsłużyć cykl życia bardziej drobnoziarnistym.

możesz zobaczyć moje przykłady wykonywana przy użyciu Sztylet-1.0.0 i Mockito dla badanych działań i Fragmenty w:

https://github.com/IIIRepublica/android-civicrm-test

Projekt badany jest w:

https://github.com/IIIRepublica/android-civicrm

Mam nadzieję, że to pomaga

Powiązane problemy