2016-03-18 15 views
9

Ho bisogno sia di Robolectric che di Mockito nel mio test, ognuno propone il proprio TestRunner, cosa devo fare?Nel mio test ho bisogno sia di Robolectric che di Mockito, ognuno propone il proprio TestRunner

ho questo codice:

@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(); 
    } 
} 

Il problema è AndroidAnnotations non iniettare le dipendenze e ho un NPE quando si cerca di utilizzare LoginPresenter

Qualcuno mi ha detto di usare il costruttore LoginPresenter_, così in questo modo posso forzare la dipendenza io stesso in questo modo:

LoginPresenter loginPresenter = LoginPresenter_.getInstance_(context); 

Al fine di ottenere l'accesso al contesto, ho dovuto passare da test di unità a test di strumentazione Android e fare getInstrumentation().getTargetContext() ma voglio test di unità, e non quelli di strumentazione.

Così un'altra persona mi ha detto di usare Robolectric per quello - si suppone che sia in grado di fornirmi un contesto di applicazione.

Tuttavia, quando ho guardato la pagina di ottenere iniziato di Robolectric, si dice

@RunWith(RobolectricGradleTestRunner.class) 

che sta andando a scontrarsi con il mio attuale @RunWith annotazioni per Mockito, così che cosa devo fare?

risposta

17

Utilizzare il canale Robolectric. Robolectric utilizza un proprio classloader che ne favorisce le sostituzioni per l'API Android, quindi ha davvero bisogno di gestire il caricamento delle classi da solo. Non c'è altro modo di usare Robolecric.

Ci sono diversi modi per inizializzare Mockito (vedi this SO answer), che sono rigorosamente equivalente ad usare il corridore, ma i due che rendono più senso per il vostro caso sono:

  • Utilizzando MockitoRule, perché si 're già in JUnit4:

    @Rule public MockitoRule rule = MockitoJUnit.rule(); 
    
  • Creazione manuale @Before e @After metodi:

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