2016-03-22 1 views
2

Ich versuche einen LoginPresenter zu testen, und ich benutze Mockito für die Mocks. Mockito lässt mich nicht verify ein Methodenaufruf auf dem SUT, also muss ich seine Abhängigkeiten spotten und verify ihre Methoden wurden von der LoginPresenter aufgerufen.Wie man dem zu testenden Subjekt sagt, den Schein anstelle seiner eigenen Variablen zu verwenden

habe ich auf die folgende Situation:

private void attemptLogin(String username, String password) { 
    new LoginNetworkOperation(username, password).execute(); 
} 

Ich habe auf execute() zu verspotten LoginNetworkOperation und mit Mockito, verify der Methodenaufruf:

LoginPresenter ein Verfahren attemptLogin genannt hat.

@Test 
public void testWhenUserNameAndPasswordAreEnteredShouldAttemptLogin() throws Exception { 
    LoginView loginView = Mockito.mock(LoginView.class); 
    LoginNetworkOperation loginNetworkOperation = Mockito.mock(LoginNetworkOperation.class); 
    Mockito.when(loginView.getUserName()).thenReturn("George"); 
    Mockito.when(loginView.getPassword()).thenReturn("aaaaaa"); 
    loginPresenter.setLoginView(loginView); 
    loginPresenter.onLoginClicked(); 
    Mockito.verify(loginNetworkOperation.execute()); 
} 

aber wie kann ich LoginPresenter die verspottete LoginNetworkOperation verwenden machen anstatt das man es in der attemptLogin Methode erstellt? Ich muss den Entwurf von LoginPresenter ändern, um eine Mitgliedsvariable zu verwenden, und einen Setter für ihn bereitstellen, der suboptimal ist, da eine lokale Variable in der Methode reichlich ist, da sie nur dort verwendet wird.

Gehe ich die ganze Sache falsch?

Ursprünglich wollte ich überprüfen, ob LoginPresenter ‚s attemptLogin genannt wird, aber Mockito kann nur verspott Objekte überprüfen‘ Methoden und ich kann nicht auf LoginPresenter auszuspionieren, weil es endgültig ist (erzeugt durch AndroidAnnotations)

+0

Sie können sich diese Antwort: http://stackoverflow.com/questions/10585490/androidannotations-and-unit-testing#10621419 –

Antwort

1

ich die Antwort gefunden in diesem Video: https://www.youtube.com/watch?v=wEhu57pih5w

Der größte Mitnehmen ist: keine Objekterstellungslogik mit Business-Logik mischen, welche Objekte in Methoden oder Konstruktoren nicht instanziiert bedeutet nicht (wahrscheinlich DI stattdessen verwenden), bec Der Testcode hat keinen Einfluss darauf, welche Kettenreaktion gestartet wird, wenn ein Konstruktor oder eine Methode eines SUT aufgerufen wird, der an ein Schlüsselwort new gebunden ist.

das, dass das LoginNetworkOperation Objekts für die Erstellung der LoginPresenter nicht verantwortlich sein sollte, in meinem Fall bedeutet, aber es von außen

auf diese Weise nehmen sollte ich es zu sagen, in der Lage, die Mock statt dem verwenden konkrete Umsetzung, und damit werde ich in der Lage, meine Tests zu tun