Mockito接口方法冲突

时间:2014-05-22 15:12:53

标签: java unit-testing generics mockito junit4

我有这样的代码:

import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;

import org.junit.Test;

interface IListener<E> {
    void onEvent(E e);
}

interface MyListener extends IListener<String> {
    @Override
    void onEvent(String s);
}

public class XYZ {
    @Test
    public void test() {
        MyListener myListener = mock(MyListener.class);
        IListener<String> listener = myListener;
        listener.onEvent("XYZ");
        verify(myListener).onEvent(any(String.class));
    }

}

导致测试失败。我理解,在MyListener中重写onEvent方法过多,但Java允许这样做,可以由第三方编码人员完成。

你能解释一下,为什么它导致测试失败,而如果MyListener没有覆盖onEvent方法,一切正常。

1 个答案:

答案 0 :(得分:2)

既然你这样做:

IListener<String> listener = myListener;
listener.onEvent("XYZ");

表示调用IListener&#39; s .onEvent()。但是Mockito的代理已超过MyListener,您在后者中重新定义.onEvent()

因此,Mockito将看不到您对IListener .onEvent()的来电。

如果您将覆盖移至.onEvent()中的MyListener,那么它会起作用(顺便提一下,为什么首先覆盖它?)。


执行此操作的一种方法是将模拟作为IListener<String>启动,而不是MyListener

另一种方式,但是urgh。请注意,您的模拟必须是最终的才能生效。

    doAnswer(new Answer<Void>()
    {
        @Override
        public Void answer(final InvocationOnMock invocation)
            throws Throwable
        {
            final String o = (String) invocation.getArguments()[0];
            myListener.onEvent(o);
            return null;
        }
    }).when((IListener<String>) myListener).onEvent(anyString());