我有这样的代码:
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方法,一切正常。
答案 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());