2017-03-31 37 views
0

我刚刚开始测试,我也在我的android应用中使用MVP模式。NPE当调用模拟

目前我有一个使用下面的Android代码来测试,如果电子邮件地址是有效的一个主持人:

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

因为它不可能与本地JVM单元测试,我决定到后面躲起来,对其进行测试接口:

public interface EmailValidator { 

    boolean isValidEmail(CharSequence target); 

} 

和这里的实现:

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

} 

所以现在我的测试代码:

公共类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(); 
} 

} 

,现在我得到一个NPE当上面的调用代码: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) 

和我的问题是:这不是我应该如何使用Mockito?有什么我可以做的测试我的代码,并避免NPE

回答

2

发生这种情况是因为您正在嘲笑EmailValidator但您没有在SignUpPresenter内使用该对象。

你应该通过构造函数中的引用:

presenter = new SignUpPresenter(view, validator);

或方法签名:

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


那么你发言人应该是这样的:

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

你应该试试这个,因为你需要提供一个真正实现你的接口的

@InjectMocks 
private EmailValidator validator = new EmailValidatorImpl();