我有这样的代码:

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方法,则一切正常。

最佳答案

由于您这样做:

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


这意味着IListener.onEvent()被调用。但是Mockito的代理位于MyListener之上,而您在后者中重新定义了.onEvent()

结果,Mockito将看不到您对IListener.onEvent()的呼叫。

如果在.onEvent()中将替代删除到MyListener,那么它将起作用(为什么首先要替代它?)。



一种方法是将模拟作为IListener<String>而不是MyListener初始化。

换一种方式,但是要坚持。请注意,您的模拟必须是最终的,此功能才能起作用。

    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());

08-05 13:26