Mockito 和回调返回 "Argument(s) are different!"
Mockito and callback returning "Argument(s) are different!"
我正在尝试在 android 上使用 mockito。我想将它与一些回调一起使用。
这是我的测试:
public class LoginPresenterTest {
private User mUser = new User();
@Mock
private UsersRepository mUsersRepository;
@Mock
private LoginContract.View mLoginView;
/**
* {@link ArgumentCaptor} is a powerful Mockito API to capture argument values and use them to
* perform further actions or assertions on them.
*/
@Captor
private ArgumentCaptor<LoginUserCallback> mLoadLoginUserCallbackCaptor;
private LoginPresenter mLoginPresenter;
@Before
public void setupNotesPresenter() {
// Mockito has a very convenient way to inject mocks by using the @Mock annotation. To
// inject the mocks in the test the initMocks method needs to be called.
MockitoAnnotations.initMocks(this);
// Get a reference to the class under test
mLoginPresenter = new LoginPresenter(mUsersRepository, mLoginView);
// fixtures
mUser.setFirstName("Von");
mUser.setLastName("Miller");
mUser.setUsername("von.miller@broncos.us");
mUser.setPassword("Broncos50superBowlWinners");
}
@Test
public void onLoginFail_ShowFail() {
// When try to login
mLoginPresenter.login("von.miller@broncos.us", "notGoodPassword");
// Callback is captured and invoked with stubbed user
verify(mUsersRepository).login(eq(new User()), mLoadLoginUserCallbackCaptor.capture());
mLoadLoginUserCallbackCaptor.getValue().onLoginComplete(eq(mUser));
// The login progress is show
verify(mLoginView).showLoginFailed(anyString());
}
但是我得到了这个错误:
Argument(s) are different! Wanted:
mUsersRepository.login(
ch.example.project.Model.User@a45f686,
<Capturing argument>
);
-> at example.ch.project.Login.LoginPresenterTest.onLoginFail_ShowFail(LoginPresenterTest.java:94)
Actual invocation has different arguments:
mUsersRepository.login(
ch.example.project.Model.User@773bdcae,
ch.example.project.Login.LoginPresenter@1844b009
);
也许问题是第二个实参是 ch.example.project.Login.LoginPresenter$1@1844b009 ?
我关注了:https://codelabs.developers.google.com/codelabs/android-testing/#5
感谢您的帮助=)
编辑
我尝试测试的方法(LoginPresenter):
@Override
public void login(String email, String password) {
mLoginView.showLoginInProgress();
User user = new User();
user.setUsername(email);
user.setPassword(password);
mUsersRepository.login(user, new UsersRepository.LoginUserCallback() {
@Override
public void onLoginComplete(User loggedUser) {
mLoginView.showLoginComplete();
}
@Override
public void onErrorAtAttempt(String message) {
mLoginView.showLoginFailed(message);
}
});
}
eq(new User())
当使用 eq
(或根本不使用匹配器)时,Mockito 使用传入实例的 equals
方法比较参数。除非您定义了灵活的 equals
用户对象的实现,这很可能会失败。
考虑使用 isA(User.class)
,这将简单地验证对象 instanceof User
,或 any()
或 anyObject()
完全跳过匹配第一个参数。
我正在将 mvp 模式与 rxjava 2 和 dagger 2 结合使用,并且被困在使用 Mockito 对演示者进行单元测试。给我“参数不同!”的代码错误:
@Mock
ImageService imageService;
@Mock
MetadataResponse metadataResponse;
private String imageId = "123456789";
@Test
public void getImageMetadata() {
when(imageService.getImageMetadata(imageId)).thenReturn(Observable.just(Response.success(metadataResponse)));
presenter.getImageMetaData(imageId);
verify(view).showImageData(new ImageData()));
}
抛出如下错误信息:
Argument(s) are different! Wanted: Actual invocation has different
arguments: com.example.model.ImageData@5q3v861
感谢@Jeff Bowman 的回答,我更改了这一行后它起作用了
verify(view).showImageData(new ImageData()));
和
verify(view).showImageData(isA(ImageData.class));
我正在尝试在 android 上使用 mockito。我想将它与一些回调一起使用。 这是我的测试:
public class LoginPresenterTest {
private User mUser = new User();
@Mock
private UsersRepository mUsersRepository;
@Mock
private LoginContract.View mLoginView;
/**
* {@link ArgumentCaptor} is a powerful Mockito API to capture argument values and use them to
* perform further actions or assertions on them.
*/
@Captor
private ArgumentCaptor<LoginUserCallback> mLoadLoginUserCallbackCaptor;
private LoginPresenter mLoginPresenter;
@Before
public void setupNotesPresenter() {
// Mockito has a very convenient way to inject mocks by using the @Mock annotation. To
// inject the mocks in the test the initMocks method needs to be called.
MockitoAnnotations.initMocks(this);
// Get a reference to the class under test
mLoginPresenter = new LoginPresenter(mUsersRepository, mLoginView);
// fixtures
mUser.setFirstName("Von");
mUser.setLastName("Miller");
mUser.setUsername("von.miller@broncos.us");
mUser.setPassword("Broncos50superBowlWinners");
}
@Test
public void onLoginFail_ShowFail() {
// When try to login
mLoginPresenter.login("von.miller@broncos.us", "notGoodPassword");
// Callback is captured and invoked with stubbed user
verify(mUsersRepository).login(eq(new User()), mLoadLoginUserCallbackCaptor.capture());
mLoadLoginUserCallbackCaptor.getValue().onLoginComplete(eq(mUser));
// The login progress is show
verify(mLoginView).showLoginFailed(anyString());
}
但是我得到了这个错误:
Argument(s) are different! Wanted:
mUsersRepository.login(
ch.example.project.Model.User@a45f686,
<Capturing argument>
);
-> at example.ch.project.Login.LoginPresenterTest.onLoginFail_ShowFail(LoginPresenterTest.java:94)
Actual invocation has different arguments:
mUsersRepository.login(
ch.example.project.Model.User@773bdcae,
ch.example.project.Login.LoginPresenter@1844b009
);
也许问题是第二个实参是 ch.example.project.Login.LoginPresenter$1@1844b009 ?
我关注了:https://codelabs.developers.google.com/codelabs/android-testing/#5
感谢您的帮助=)
编辑
我尝试测试的方法(LoginPresenter):
@Override
public void login(String email, String password) {
mLoginView.showLoginInProgress();
User user = new User();
user.setUsername(email);
user.setPassword(password);
mUsersRepository.login(user, new UsersRepository.LoginUserCallback() {
@Override
public void onLoginComplete(User loggedUser) {
mLoginView.showLoginComplete();
}
@Override
public void onErrorAtAttempt(String message) {
mLoginView.showLoginFailed(message);
}
});
}
eq(new User())
当使用 eq
(或根本不使用匹配器)时,Mockito 使用传入实例的 equals
方法比较参数。除非您定义了灵活的 equals
用户对象的实现,这很可能会失败。
考虑使用 isA(User.class)
,这将简单地验证对象 instanceof User
,或 any()
或 anyObject()
完全跳过匹配第一个参数。
我正在将 mvp 模式与 rxjava 2 和 dagger 2 结合使用,并且被困在使用 Mockito 对演示者进行单元测试。给我“参数不同!”的代码错误:
@Mock
ImageService imageService;
@Mock
MetadataResponse metadataResponse;
private String imageId = "123456789";
@Test
public void getImageMetadata() {
when(imageService.getImageMetadata(imageId)).thenReturn(Observable.just(Response.success(metadataResponse)));
presenter.getImageMetaData(imageId);
verify(view).showImageData(new ImageData()));
}
抛出如下错误信息:
Argument(s) are different! Wanted: Actual invocation has different arguments: com.example.model.ImageData@5q3v861
感谢@Jeff Bowman 的回答,我更改了这一行后它起作用了
verify(view).showImageData(new ImageData()));
和
verify(view).showImageData(isA(ImageData.class));