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

时间:2016-07-06 06:25:05

标签: java mockito powermock

调用一个类,在某个时候调用它来添加一个带有签名的ActionListener实例(java.awt.event中的接口)

public void addActionListener(ActionListener l).

尝试模拟方法调用以使用答案,以便在使用匿名创建的ActionListener实例(就像在此answer中)调用它时,我可以跟踪其ActionListener。但我无法让它接受任何接口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..]);

所有这些都会出现编译错误,说无法在(无效)时解析方法。

有没有办法让Matchers.any匹配任何实现该接口的实例,并将其用于答案?这是不可能的,因为它的返回值是无效的吗?

使用Mockito 1.10,powermock 1.6.5和java 7.(我不能使用Java 8)

1 个答案:

答案 0 :(得分:3)

您可以使用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))