2017-03-31 3 views
0

Ich habe gerade mit dem Testen begonnen und ich verwende auch MVP Muster in meinen Android-Apps.NPE beim Aufruf von Mock

Zur Zeit habe ich ein Moderator, der die folgenden Android-Code verwendet, um zu testen, ob eine E-Mail-Adresse gültig ist:

android.util.Patterns.EMAIL_ADDRESS.matcher(target).matches() 

Da es nicht möglich ist, es mit einem lokalen JVM Unit-Test zu testen, habe ich beschlossen, es hinter sich zu verstecken eine Schnittstelle:

public interface EmailValidator { 

    boolean isValidEmail(CharSequence target); 

} 

und hier ist die Umsetzung:

public class EmailValidatorImpl implements EmailValidator { 

@Override 
public boolean isValidEmail(CharSequence target) { 
    if (target == null) { 
     return false; 
    } else { 
     return android.util.Patterns.EMAIL_ADDRESS.matcher(target).matches(); 
    } 
} 

} 

So jetzt mein Testcode ist:

public class SignUpPresenterTest {

@Mock 
private SignUpMVP.View view; 

@Mock 
private EmailValidator validator; 

private SignUpPresenter presenter; 

private String email = "[email protected]"; 
private String password = "ABCDabcd"; 
private String username = "username"; 

@Before 
public void setUp() throws Exception { 
    MockitoAnnotations.initMocks(this); 

    presenter = new SignUpPresenter(view); 
} 

@Test 
public void onButtonSignUpClicked() throws Exception { 
    when(validator.isValidEmail(email)) 
      .thenReturn(true); 

    presenter.onButtonSignUpClicked(email, password, username); 

    verify(view).executeSignUpService(); 
} 

} 

und jetzt eine NPE Ich erhalte, wenn der Code über Anrufe: EmailValidatorImpl.isValidEmail()

java.lang.NullPointerException 
at com.example.signup.helpers.EmailValidatorImpl.isValidEmail(EmailValidatorImpl.java:20) 
at com.example.signup.SignUpPresenter.showErrors(SignUpPresenter.java:67) 
at com.example.signup.SignUpPresenter.onButtonSignUpClicked(SignUpPresenter.java:25) 
at com.example.signup.SignUpPresenterTest.onButtonSignUpClicked(SignUpPresenterTest.java:43) 

und meine Fragen : Ist das nicht wie ich Mockito verwenden soll? Kann ich irgendetwas tun, um meinen Code zu testen und NPE zu vermeiden?

Antwort

2

Das passiert, weil Sie die EmailValidator verspotten, aber Sie verwenden dieses Objekt nicht innerhalb SignUpPresenter.

Sie sollten die Referenz in den Konstruktor übergeben:

presenter = new SignUpPresenter(view, validator);

oder in der Methodensignatur:

presenter.onButtonSignUpClicked(email, password, username, validator);


Dann Moderatorin Sie so etwas wie dies sein sollte:

public class SignUpPresenter { 

    private View view; 
    private EmailValidator validator; 

    public SignUpPresenter(View view, EmailValidator validator) { 
     this.view = view; 
     this.validator = validator; 
    } 

    private void onButtonSignUpClicked(String email, String password, String username) { 
     //Your code... 
     boolean isValid = validator.isValidEmail(email); 
    } 
} 
2

Sie sollten mit diesem versuchen, weil Sie eine echte Umsetzung Ihrer Schnittstelle benötigen

@InjectMocks 
private EmailValidator validator = new EmailValidatorImpl(); 
Verwandte Themen