我在使用 Mockito 时遇到问题。我有一个类似这样的类(class):
public class Foo<T> {
BaseView mView;
public Foo(BaseView view) {
mView = view;
}
public void onResponse(T data) {
mView.setup(data);
}
public void onError(int error) {
mView.displayError(error);
}
}
好的,那么我想做什么?
这是我想要为 Foo 做的测试流程,
模拟Foo
的BaseView
。
如果调用了 Foo onResponse
错误,则返回 true。
如果已调用 Foo onError
,则返回 false。
这是我已经尝试过的:
public class BasePresenterCompatTest<T extends BasePresenterCompat> {
private Boolean setupCalled;
public void TestPresenterCall(BasePresenterCompat mPresenter) throws Exception {
Mockito.doAnswer(new TrueAnswer()).when(Mockito.mock(mPresenter.getClass())).onResponse(Mockito.any());
Mockito.doAnswer(new FalseAnswer()).when(Mockito.mock(mPresenter.getClass())).onError(Mockito.anyInt(), Mockito.anyString());
Assert.assertEquals(true, setupCalled);
}
class TrueAnswer implements Answer<Boolean> {
@Override
public Boolean answer(InvocationOnMock invocation) throws Throwable {
return setupCalled = true;
}
}
class FalseAnswer implements Answer<Boolean> {
@Override
public Boolean answer(InvocationOnMock invocation) throws Throwable {
return setupCalled = false;
}
}
}
Answer 接口(interface)实现是一个好方法吗?因为我尝试调试测试,但它从未进入答案类答案方法,所以我错过了什么?
哦,我忘了添加,我用上面的方法得到的异常是:
Wanted but not invoked.
Actually, there were zero interactions with this mock.
最佳答案
测试此场景的常见方法...
mPresenter is an Instance of a class called BasePresenter in the project, it calls a Retrofit Client with a Callback, the callback sends to this BasePresenter data in "onResponse" method or a @StringRes integer in "onError".
... 是模拟 verify 上调用的任何回调。对该模拟进行了正确的调用。
例如:
@Test
public void testMockInvocation() {
BaseView baseView = Mockito.mock(BaseView.class);
Foo<String> foo = new Foo(baseView);
String input = "some input";
foo.onResponse(input);
Mockito.verify(baseView).setup(input);
int error = 1;
foo.onError(error);
Mockito.verify(baseView).displayError(error);
}
由于 setup
和 displayError
方法的类型为 void
,因此它们无法返回任何内容,因此我怀疑...
If Foo onResponse error has been called, return true. If Foo onError has been called, return false.
... 指的是关于您的测试如何证明/验证在 baseView
上调用了正确方法的想法。如果是这样,那么您可以使用 Mockito.verify()
(如上面的示例所示)来执行此操作。
关于java - Mockito - 当调用 void 方法时设置一个标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46591398/