mock接口方法冲突



我的代码是:

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

相关内容

  • 没有找到相关文章

最新更新