如何使用 Mockito 模拟 void 方法

新手上路,请多包涵

如何模拟具有 void 返回类型的方法?

我实现了一个观察者模式,但我不能用 Mockito 模拟它,因为我不知道怎么做。

并且我试图在网上找例子但是没有成功。

我的课看起来像这样:

 public class World {

    List<Listener> listeners;

    void addListener(Listener item) {
        listeners.add(item);
    }

    void doAction(Action goal,Object obj) {
        setState("i received");
        goal.doAction(obj);
        setState("i finished");
    }

    private string state;
    //setter getter state
}

public class WorldTest implements Listener {

    @Test public void word{
    World  w= mock(World.class);
    w.addListener(this);
    ...
    ...

    }
}

interface Listener {
    void doAction();
}

系统不会被 mock 触发。

我想显示上述系统状态。并根据它们做出断言。

原文由 ibrahimyilmaz 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

查看 Mockito API 文档。 As the linked document mentions (Point # 12) you can use any of the doThrow() , doAnswer() , doNothing() , doReturn() family of methods从 Mockito 框架到模拟 void 方法。

例如,

 Mockito.doThrow(new Exception()).when(instance).methodName();

或者如果你想将它与后续行为结合起来,

 Mockito.doThrow(new Exception()).doNothing().when(instance).methodName();

假设您正在查看模拟 setter setState(String s) 在下面的类 World 中,代码使用 doAnswer 方法来模拟 setState .

 World mockWorld = mock(World.class);
doAnswer(new Answer<Void>() {
    public Void answer(InvocationOnMock invocation) {
      Object[] args = invocation.getArguments();
      System.out.println("called with arguments: " + Arrays.toString(args));
      return null;
    }
}).when(mockWorld).setState(anyString());

原文由 sateesh 发布,翻译遵循 CC BY-SA 4.0 许可协议

我想我已经找到了这个问题的一个更简单的答案,只为一个方法调用真正的方法(即使它有一个 void 返回)你可以这样做:

 Mockito.doCallRealMethod().when(<objectInstance>).<method>();
<objectInstance>.<method>();

或者,您可以为该类的所有方法调用真正的方法,这样做:

 <Object> <objectInstance> = mock(<Object>.class, Mockito.CALLS_REAL_METHODS);

原文由 MarcioB 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题