Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Mockito和回调返回“;参数不同&引用;_Android_Junit_Mockito_Junit4 - Fatal编程技术网

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

我正在尝试在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());
}
使用
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));