如何模拟返回类型为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();
}

系统不会通过模拟触发.

我想展示上面提到的系统状态.并据此做出断言.

推荐答案

看看Mockito API docs.正如链接文档所提到的(第12点),您可以使用从Mockito框架到mock void方法的doThrow()doAnswer()doNothing()doReturn()系列方法中的任何一种.

例如

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

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

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

假设您正在下面的类世界中模拟setter setState(String s),那么代码将使用doAnswer方法模拟setter 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());

Java相关问答推荐

Java字符串常数池困惑

如何为具有多对多关系的实体的给定SQL查询构建JPA规范?

在现代操作系统/硬件上按块访问数据值得吗?

滚动视图&不能在alert 对话框中工作(&Q;&Q;)

我找不到&Quot;配置&的位置

只需最少的代码更改即可将版本号标记添加到日志(log)

如何从错误通道回复网关,使其不会挂起

try 将JSON字符串响应从API转换为映射字符串、对象>;时出错

我怎样才能让IntelliJ标记toString()的任何实现?

使用Jackson库反序列化json

在一行中检索字符分隔字符串的第n个值

在不使用instanceof或强制转换的情况下从父类变量调用子类方法

Win32函数的JNA绑定DwmGetColorizationColor返回E_INVALIDARG错误

我该如何为我的类编写getter和setter方法?

如何在Java中的重写方法参数中强制(Enum)接口实现?

Java CDI:@Singleton@Startup@Inject无法实现接口

如何使用stream.allMatch()为空流返回false?

spring 数据Elastic search 与 spring 启动数据Elastic search 之间的区别是什么?

在输入端没有可行的替代方案'; Select *';

双对象供应商