2016-03-18 5 views
9

Ich brauche sowohl Robolectric als auch Mockito in meinem Test, jeder schlägt seinen eigenen TestRunner vor, was mache ich?Ich brauche sowohl Robolectric als auch Mockito in meinem Test, jeder schlägt seinen eigenen TestRunner vor

Ich habe diesen Code:

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

Das Problem ist AndroidAnnotations nicht die Abhängigkeiten injizieren und ich bekomme eine NPE wenn LoginPresenter

Jemand hat mir gesagt, zu verwenden versuchen, den LoginPresenter_ Konstruktor zu verwenden, so dass ich die Abhängigkeit selbst auf diese Weise injizieren kann:

Um Zugang zu bekommen Kontext, ich musste von Komponententests zu Android Instrumentation Tests wechseln und tun getInstrumentation().getTargetContext() , aber ich möchte Unit Tests, und nicht Instrumentierung.

So eine andere Person sagte mir, Robolectric dafür zu verwenden - es soll in der Lage sein, mich mit einem Anwendungskontext zu versorgen.

Allerdings, wenn ich auf der Seite Erste Schritte von Robolectric sah, heißt es

@RunWith(RobolectricGradleTestRunner.class) 

, die mit meiner aktuellen @RunWith Anmerkung für Mockito kollidieren wird, also was soll ich tun?

Antwort

17

Verwenden Sie den Robolectric-Läufer. Robolectric verwendet einen eigenen Classloader, der seine Ersetzungen für die Android-API bevorzugt, so dass es wirklich allein mit Classloading umgehen muss. Es gibt keine andere Möglichkeit, Robolecric zu verwenden.

Es gibt mehrere Möglichkeiten Mockito (siehe this SO answer), die sind absolut gleichwertig mit dem Läufer zu initialisieren, aber die beiden, die am meisten Sinn für Ihren Fall zu machen sind:

  • MockitoRule verwenden, da Sie bist schon auf JUnit4:

    @Rule public MockitoRule rule = MockitoJUnit.rule(); 
    
  • Erstellen von manuellen @Before und @After Methoden:

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