Java Mockito接口方法冲突
我有这样的代码:Java Mockito接口方法冲突,java,unit-testing,generics,mockito,junit4,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 IListene
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));
}
}
import static org.mockito.Matchers.any;
导入静态org.mockito.mockito.mock;
导入静态org.mockito.mockito.verify;
导入org.junit.Test;
界面调节器{
无效事件(E);
}
接口MyListener扩展了IListener{
@凌驾
void onEvent(字符串s);
}
公共类XYZ{
@试验
公开无效测试(){
MyListener MyListener=mock(MyListener.class);
IListener listener=myListener;
listener.onEvent(“XYZ”);
验证(myListener).onEvent(any(String.class));
}
}
这会导致测试失败。我理解,在MyListener中重写OneEvent方法是过分的,但是Java允许这样做,并且可以由第三方编码人员来完成
您能否解释一下,为什么它会导致测试失败,而如果MyListener不重写OneEvent方法,则一切正常。既然您这样做了:
IListener<String> listener = myListener;
listener.onEvent("XYZ");
故障消息的具体状态是什么?乍一看,这似乎应该通过。如果改用
myListener.onEvent(“XYZ”)
会发生什么?或者verify(listener).onEvent(any(String.class))代码>?@Jon_Skeet那么它就可以正常工作了!我没有。这是我使用的第三方代码,它的编码方式很奇怪。但关键是,如果可以用Java实现,应该有一种方法来测试它。好吧,请看答案,但你的案例很奇怪。实际上还有另一种方法,请看答案是的,但这真的很难看。有一件事我没有尝试过,那就是将myListener
转换成IListener
转换成verify
;如果它起作用,我会避免那种代码。。。
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());