Android Mockito和回调返回“;参数不同&引用;
我正在尝试在android上使用mockito。我想把它和一些回调一起使用。 以下是我的测试:Android Mockito和回调返回“;参数不同&引用;,android,junit,mockito,junit4,Android,Junit,Mockito,Junit4,我正在尝试在android上使用mockito。我想把它和一些回调一起使用。 以下是我的测试: public class LoginPresenterTest { private User mUser = new User(); @Mock private UsersRepository mUsersRepository; @Mock private LoginContract.View mLoginView; /** * {@link ArgumentCaptor} is a po
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());
}
使用eq
(或根本不使用匹配器)时,Mockito使用传入实例的equals
方法比较参数。除非为用户对象定义了灵活的equals
实现,否则很可能会失败
考虑使用
isA(User.class)
,它将简单地验证用户的对象实例,或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()));
}
它会抛出如下错误消息:
参数不同!需要:实际调用具有不同的
参数:com.example.model。ImageData@5q3v861
感谢@jeffbowman的回答,我改了这条线后,它就成功了
verify(view).showImageData(new ImageData()));
与
谢谢您的回答,但是当我在用户之前删除eq()时,我得到了一个新错误:“org.mockito.exceptions.misusing.InvalidUseOfMatchersException:参数匹配器的使用无效!需要2个匹配器,1个记录:->at.Login.LoginPresenterTest.onLoginFail_ShowFail(LoginPresenterTest.java:94)如果匹配器与原始值组合,则可能会发生此异常://不正确:somethod(anyObject(),“原始字符串”);使用匹配器时,所有参数都必须由匹配器提供。例如://correct:someMethod(anyObject(),eq(“字符串匹配器”)@Xero:当您使用匹配器时,您需要为每个参数使用一个匹配器(或捕获器)。这就是为什么我不建议只删除eq
,而是用我列出的三个匹配器(isA
,any
,或anyObject
)中的一个替换表达式。我在用户上尝试了isA、any和anyObject,但得到了相同的错误。你不认为错误来自第二个参数吗?我用我尝试测试的方法编辑了我的帖子,它可以帮助我在我的机器上运行你的代码,重现问题并应用Jeff fix-所有工作。代码中还有一个错误,但其余的都可以。您确定这一行:verify(mUsersRepository).login(isA(User.class),mLoadLoginUserCallbackCaptor.capture())代码>仍然失败?此外,您可能希望将上次验证更改为:mLoadLoginUserCallbackCaptor.getValue().onerroratettempt(“错误”)代码>
eq(new User())
@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()));
}
verify(view).showImageData(new ImageData()));
verify(view).showImageData(isA(ImageData.class));