2017-08-21 2 views
1

Ich schreibe Mockito-Tests für App basierend auf MVP-Muster. Im Folgenden ist der Code für Anmeldung AktivitätUnit Test - wie man Listener verspotten

public class LoginActivity extends AppCompatActivity implements LoginContract.ILoginView{ 

presenter = new LoginPresenter(this); 

@Override 
    public void startMoviesActivity() { 
     startActivity(new Intent(this, MoviesActivity.class)); 
    } 
} 



public class LoginContract { 
    public interface ILoginView { 
      ... 
      void startMoviesActivity(); 
     } 

    public interface ILoginService { 

      interface OnLoginFinishedListener { 
       void onLoginSuccess(); 
       void onLoginFailure(); 
      } 

      void login(String username, String password, OnLoginFinishedListener 
       listener); 
     } 
} 


public class LoginPresenter implements LoginContract.ILoginService.OnLoginFinishedListener { 

    private LoginContract.ILoginView view; 
    private LoginContract.ILoginService service; 

    public LoginPresenter(LoginContract.ILoginView view) { 
     this.view = view; 
     service = new LoginService(); 
    } 


    public void validateCredentials(String email, String password) { 
     if(email.isEmpty()){ 
      view.setEmailEmptyError(R.string.error_email_empty); 
      return; 
     } 
     if(password.isEmpty()){ 
      view.setPasswordEmptyError(R.string.error_password_empty); 
      return; 
     } 

     view.showProgressDialog(); 
     service.login(email,password,this); 
    } 

    @Override 
    public void onLoginSuccess() { 
     view.hideProgressDialog(); 
     view.startMoviesActivity(); 
    } 

    @Override 
    public void onLoginFailure() { 
     view.hideProgressDialog(); 
     view.showUnsuccessfulLoginError(R.string.error_login_unsuccessful); 
    } 
} 

public class LoginService implements LoginContract.ILoginService { 

    @Override 
    public void login(String username, String password, final 
     OnLoginFinishedListener listener) { 
    // Contains REST API which calls listener.onLoginSuccess() on valid credentials and listener.onLoginFailure on invalid. 
    } 
} 

I Problem für die Prüfung schriftlich Test habe onLoginSuccess() & onLoginFailure() in LoginPresenter Klasse wegen der Art, wie ich Schnittstellen verwendet haben. Wenn der Anruf an service.login(email,password,this); getätigt wird, sollte er den Aufruf an diese Methode in LoginPresenter zurückgeben, die im Gegenzug zu startMoviesActivity() Methode in LoginActivity ruft. Ich bin ein Anfänger zum Spott ... wenn du helfen könntest. Danke.

Antwort

0

Unten finden Sie einige Tests für Ihren Code mit Mockito, diese Fälle habe ich in meiner Maschine getestet. Allerdings, für das Testen von Android, bevorzuge ich Robolectric (http://robolectric.org/), die im Grunde für Android-UI-Unit-Test entwickelt wurde und es ist gut wr.t Code Abdeckung Sicht. Der Prozentsatz der Berichterstattung ist mehr im Vergleich zu Mockito.


import org.junit.Before; 
import org.junit.Test; 
import org.powermock.core.classloader.annotations.PrepareForTest; 

import static org.mockito.Mockito.doCallRealMethod; 
import static org.mockito.Mockito.mock; 

@PrepareForTest(LoginActivity.class) 
public class LoginActivityTest { 

    private LoginActivity loginActivity; 
    @Before 
    public void setUp() 
    { 
     loginActivity = mock(LoginActivity.class); 
     doCallRealMethod().when(loginActivity).startMoviesActivity(); 
    } 
    @Test 
    public void testStartMovies() 
    { 
     loginActivity.startMoviesActivity(); 
    } 
} 


import org.junit.Before; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.powermock.core.classloader.annotations.PrepareForTest; 
import org.powermock.modules.junit4.PowerMockRunner; 

    import static org.mockito.Mockito.doCallRealMethod; 
    import static org.mockito.Mockito.mock; 
    import static org.mockito.Mockito.when; 

    @PrepareForTest(LoginPresenter.class) 
    public class LoginPresenterTest { 

     private LoginPresenter loginPresenter; 

     @Before 
     public void setUp() { 
      loginPresenter = mock(LoginPresenter.class); 
      doCallRealMethod().when(loginPresenter).onLoginSuccess(); 
      doCallRealMethod().when(loginPresenter).onLoginFailure(); 
     } 

     @Test 
     public void testLoginSuccess() 
     { 
      loginPresenter.onLoginSuccess(); 
      loginPresenter.onLoginSuccess(); 
     } 
     @Test 
     public void testLoginFailure() 
     { 
      loginPresenter.onLoginFailure(); 
     } 
    }