Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Mockito接口方法冲突_Java_Unit Testing_Generics_Mockito_Junit4 - Fatal编程技术网

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