【问题标题】:NPE when calling mock调用模拟时的 NPE
【发布时间】:2017-03-31 16:48:33
【问题描述】:

我刚刚开始测试,我还在我的 Android 应用程序中使用MVP 模式。

目前我有一个演示者,它使用以下 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 = "name@gmail.com";
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 吗?

【问题讨论】:

    标签: java android unit-testing mockito


    【解决方案1】:

    发生这种情况是因为您在模拟 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(); 
      

      【讨论】:

        猜你喜欢
        • 2016-11-05
        • 2018-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-09
        • 1970-01-01
        相关资源
        最近更新 更多