【问题标题】:Mockito Error : However, there was exactly 1 interaction with this mockMockito 错误:但是,与此模拟只有 1 次交互
【发布时间】:2017-11-14 02:53:53
【问题描述】:

您好,我尝试使用 mockito 来验证用户密码,如果无效我想验证它显示错误消息。

但我收到以下错误:

Wanted but not invoked:
loginView.showPasswordError();
-> at android.fanjavaid.com.tdd_android_login.LoginActivityTest.invalidPassword_notLoggedIn_showPasswordError(LoginActivityTest.java:84)

However, there was exactly 1 interaction with this mock:
loginView.showEmailError();
-> at android.fanjavaid.com.tdd_android_login.presenter.LoginPresenterImpl.validateInput(LoginPresenterImpl.java:23)

这是我的测试方法:

@Test
public void invalidEmail_notLoggedIn_showEmailError() {
    LoginPresenter presenter = new LoginPresenterImpl(loginView, validator);
    presenter.validateInput(user);

    verify(loginView).showEmailError();
}

@Test
public void invalidPassword_notLoggedIn_showPasswordError() {
    when(user.getEmailAddress()).thenReturn("fanjavaid@gmail.com");

    LoginPresenter presenter = new LoginPresenterImpl(loginView, validator);
    presenter.validateInput(user);

    verify(loginView).showPasswordError();
}

我已经使用有效输入模拟invalidPassword_notLoggedIn_showPasswordError() 中的电子邮件用户,但我仍然收到该错误消息。

这是我的 Presenter 实现:

@Override
public void validateInput(User user) {
    if (!validator.validateEmail(user.getEmailAddress())) {
        view.showEmailError();
    } else if (validator.validatePassword(user.getPassword())) {
        view.showPasswordError();
    }
}

我错过了什么?

谢谢

【问题讨论】:

  • 能否在测试方法和真实方法中调试检查对象loginView引用?如果它们不同,则 mockito 适合验证失败。
  • 很高兴您的问题得到了解答!为了让回答者更容易知道你已经把它整理好了,并且为了让未来的读者找到你的解决方案,请编辑你的解决方案,into a self-answer你可以稍后接受。

标签: java android junit mockito android-mvp


【解决方案1】:

✔ 回答

再次探索几分钟后,我发现了一些有趣的东西。 我忘了在一个班级中添加模拟。 下面我像这样模拟一些类:

@RunWith(MockitoJUnitRunner.class)
public class LoginActivityTest {

    @Mock User user;
    @Mock LoginView loginView;
    @Mock MyValidator validator;

    LoginPresenter presenter;

    @Before
    public void beforeTest() {
        presenter = new LoginPresenterImpl(loginView, validator);
    }

...

你可以看到我模拟了验证器类。

我收到错误是因为在 invalidPassword_notLoggedIn_showPasswordError() 方法中我没有为电子邮件验证添加模拟值。

// Mock validation
when(validator.validateEmail(user.getEmailAddress())).thenReturn(true);

如果我不嘲笑它,它会询问showEmailError(),但我们只是验证showPasswordError()

这导致我的实现使用条件一一检查,从检查电子邮件是否有效开始,然后密码是否有效。 如果电子邮件不存在并且验证器的返回值不存在,则会发生错误。

所以我需要将电子邮件地址模拟为有效并模拟验证器以返回 true(有效电子邮件)。

这是我的解释,希望可以帮助任何尝试 mockito 的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    • 2011-12-18
    • 2019-11-07
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多