我的代码是:
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()
的调用。
如果您在MyListener
中删除对.onEvent()
的覆盖,那么它将工作(顺便问一下,您为什么首先覆盖它?)。
一种方法是将mock初始化为
IListener<String>
,而不是MyListener
。
另一种方式,但是,呃。注意,mock必须是final才能正常工作。
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());