Mockito - 匹配任何实现接口的实例,并回答

Mockito - Match any instance implementing an interface, and answer

模拟一个 class ,在某个时候被调用以添加带有签名

的 ActionListener 实例(java.awt.event 中的接口)
public void addActionListener(ActionListener l).

尝试模拟方法调用以使用答案,以便在使用匿名创建的 ActionListener 实例调用它时(就像在 answer 中一样),我可以跟踪它的 ActionListeners。但是我无法让它接受接口 ActionListener 的任何实例。

到目前为止,我已经尝试了其他问题中的几个示例,但无济于事:

when(mock.addActionListener(Matchers.<ActionListener>any())).thenAnswer(new Answer<Void>() {
        @Override
        public Void answer(InvocationOnMock invocation) throws Throwable {
            Object[] arguments = invocation.getArguments();
            if (arguments != null && arguments.length > 0 && arguments[0] != null) {
                listeners.add((ActionListener) arguments[0]);
            }
            return null;
        }
    });
when(mock.addActionListener(any(ActionListener.class))).thenAnswer([..snip..]);

它们都给出了编译错误 Cannot resolve method when(void).

有什么方法可以使 Matchers.any 匹配任何实现该接口的实例,并将其用于答案?是不是因为它的 return 值是空的?

使用 Mockito 1.10、powermock 1.6.5 和 java7。(我不能使用 Java8)

您可以使用 Mockito.doAnswer(),它是为返回 void:

的方法创建的
doAnswer(new Answer<Void>() {
    @Override
    public Void answer(InvocationOnMock invocation) throws Throwable {
        Object[] arguments = invocation.getArguments();
        if (arguments != null && arguments.length > 0 && arguments[0] != null) {
            listeners.add((ActionListener) arguments[0]);
        }
        return null;
    }
}).when(mock).addActionListener(Matchers.<ActionListener>any());
doAnswer([..snip..]).when(mock).addActionListener(any(ActionListener.class))