我有这样的代码:
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());