java - Mockito - 当调用 void 方法时设置一个标志

标签 java android unit-testing mockito

我在使用 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 做的测试流程,

模拟FooBaseView。 如果调用了 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);
}

由于 setupdisplayError 方法的类型为 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/

相关文章:

python - Django 模拟补丁无法正常工作

java - Android:无法创建媒体播放器(请使用 URL)

android - 复选框会在 Android 中自动选中

android - Flutter(或Dart)的QR扫描插件

android - 判断手机是否重启过

python - 数独求解器中未定义全局名称 checkRows

ruby - 编写单元测试以将数据保存到数据库中

java - 如何在 RecyclerView 中使用的字符串上使用自定义字体?

java - 我真的不明白我的讲师在这里说的是什么——关于用 Java 计算素数的讲义

java - 无法在 Jtable 中调用 JTable Cellrenderer