Mockito Error : However, there was exactly 1 interaction with this mock
Mockito Error : However, there was exactly 1 interaction with this mock
您好,我尝试使用 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();
}
}
我错过了什么?
谢谢
✔ ANSWER
再次探索几分钟后,我发现了一些有趣的东西。
我忘了给一个 class 添加 mock。
下面我嘲笑一些 classes moreless 像这样:
@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);
}
...
你可以看到我模拟了验证器class。
我收到错误是因为在 invalidPassword_notLoggedIn_showPasswordError()
方法中我没有为电子邮件验证添加模拟值。
// Mock validation
when(validator.validateEmail(user.getEmailAddress())).thenReturn(true);
如果我不模拟它,它会询问 showEmailError()
但我们只是验证 showPasswordError()
这导致我的实现使用条件来逐一检查,从检查电子邮件是否有效开始,然后是密码是否有效。
如果电子邮件不存在且验证器的 return 值不存在,则会发生错误。
所以我需要将电子邮件地址模拟为有效并将验证器模拟为 return true(有效电子邮件)。
这就是我的解释,希望对尝试 mockito 的人有所帮助。
您好,我尝试使用 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();
}
}
我错过了什么?
谢谢
✔ ANSWER
再次探索几分钟后,我发现了一些有趣的东西。 我忘了给一个 class 添加 mock。 下面我嘲笑一些 classes moreless 像这样:
@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);
}
...
你可以看到我模拟了验证器class。
我收到错误是因为在 invalidPassword_notLoggedIn_showPasswordError()
方法中我没有为电子邮件验证添加模拟值。
// Mock validation
when(validator.validateEmail(user.getEmailAddress())).thenReturn(true);
如果我不模拟它,它会询问 showEmailError()
但我们只是验证 showPasswordError()
这导致我的实现使用条件来逐一检查,从检查电子邮件是否有效开始,然后是密码是否有效。 如果电子邮件不存在且验证器的 return 值不存在,则会发生错误。
所以我需要将电子邮件地址模拟为有效并将验证器模拟为 return true(有效电子邮件)。
这就是我的解释,希望对尝试 mockito 的人有所帮助。