我对Mockito有问题。我有一堂课,看起来像这样:

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做的测试流程,

BaseView模拟一个Foo
如果调用了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接口的实现是一种好方法吗?因为我尝试调试测试,并且它从未进入Answer类的answer方法,所以我遗漏了什么?

我忘了添加,上面的方法遇到的异常是:

      Wanted but not invoked.
     Actually, there were zero interactions with this mock.

最佳答案

测试这种情况的常用方法...


  mPresenter是项目中名为BasePresenter的类的实例,它通过回调来调用Retrofit Client,回调通过“ onResponse”方法向该BasePresenter发送数据,或者在“ onError”中将@StringRes整数发送给该对象。


...可以模拟调用了什么回调,并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);
}


由于setupdisplayError方法的类型为void,它们无法返回任何内容,因此我怀疑这是...


  如果已调用Foo onResponse错误,则返回true。如果已调用Foo onError,则返回false。


...表示关于您的测试如何证明/验证在baseView上调用了正确方法的想法。如果是这样,则可以使用Mockito.verify()(如上例所示)执行此操作。

关于java - Mockito-在调用void方法时设置一个标志,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46591398/

10-16 19:24
查看更多