2016-03-18 25 views
9

Potrzebuję zarówno Robolectric i Mockito w moim teście, każdy z nich proponuje własny TestRunner, co mam zrobić?Potrzebuję zarówno Robolectric i Mockito w moim teście, każdy z nich proponuje własny TestRunner

mam ten kod:

@RunWith(MockitoJUnitRunner.class) 
@EBean 
public class LoginPresenterTest { 

    @Bean 
    LoginPresenter loginPresenter; 

    @Mock 
    private LoginView loginView; 

    @AfterInject 
    void initLoginPresenter() { 
     loginPresenter.setLoginView(loginView); 
    } 

    @Test 
    public void whenUserNameIsEmptyShowErrorOnLoginClicked() throws Exception { 
     when(loginView.getUserName()).thenReturn(""); 
     when(loginView.getPassword()).thenReturn("asdasd"); 
     loginPresenter.onLoginClicked(); 
     verify(loginView).setEmailFieldErrorMessage(); 
    } 
} 

Problem polega AndroidAnnotations nie wstrzykiwać zależności i dostaję NPE podczas próby użycia LoginPresenter

ktoś powiedział mi użyć konstruktora LoginPresenter_, więc mogę samodzielnie wymusić zależność w ten sposób:

LoginPresenter loginPresenter = LoginPresenter_.getInstance_(context); 

Aby uzyskać dostęp do W związku z tym musiałem przełączyć się z testów jednostkowych na testy urządzeń Android i wykonać getInstrumentation().getTargetContext() , ale chcę mieć testy jednostkowe, a nie oprzyrządowanie.

Tak więc inna osoba powiedziała mi, żebym użył do tego celu Robolectric - ma ona być w stanie zapewnić mi kontekst Aplikacji.

Jednak, kiedy spojrzał na podręcznej stronie Robolectric, mówi

@RunWith(RobolectricGradleTestRunner.class) 

który będzie kolidować z moim obecnym @RunWith adnotacji dla Mockito, więc co mam zrobić?

Odpowiedz

17

Użyj biegacza Robolectric. Robolectric używa własnego programu ładującego klasy, który faworyzuje jego zamienniki dla Androida API, więc naprawdę musi sam poradzić sobie z klasą ładowania. Nie ma innego sposobu na użycie Robolecric.

Istnieje kilka sposobów, aby zainicjować Mockito (patrz this SO answer), które są ściśle równoważne użyciu biegaczem, ale dwa, które sprawiają, że największy sens w Twoim przypadku to:

  • Korzystanie MockitoRule, bo jesteś już na JUnit4:

    @Rule public MockitoRule rule = MockitoJUnit.rule(); 
    
  • Tworzenie ręcznych @Before i @After metody:

    @Before public void setUpMockito() { 
        MockitoAnnotations.initMocks(this); 
    } 
    
    @After public void tearDownMockito() { 
        Mockito.validateMockitoUsage(); 
    }