java-为什么Mockito与InputStreams怪异?

调试时,我使用Mockito 1.10遇到了令人难以置信的奇怪现象.我希望有人可以解释这里的行为:

当我运行以下命令时,线程挂起,并且测试永不返回.创建的Java进程的CPU也是天文数字!

@Test(expected = IOException.class)
public void mockitoWeirdness() throws IOException {
    final InputStream mis = mock(InputStream.class);
    doThrow(IOException.class).when(mis).read();
    ByteStreams.copy(mis, new ByteArrayOutputStream());
}

当我按如下方式手动存根此方法时,将抛出预期的IOException:

@Test(expected = IOException.class)
public void nonMockitoExpected() throws IOException {
    final InputStream mis = new InputStream() {

        @Override
        public int read() throws IOException {
            throw new IOException();
        }
    };
    ByteStreams.copy(mis, new ByteArrayOutputStream());
}

任何了解模仿方法为何以及为何失败的帮助都将是很棒的.

解决方法:

如果看一下ByteStreams的实现,您会看到使用了read(buf)方法.
在您的情况下,它返回null,因为没有模拟定义,这将导致copy方法中的无限循环.

您可以更改default mock behaviour,也可以手动为read(buff)方法添加定义.

上一篇:用Mockito模拟android模式


下一篇:java-如何对带有@InjectMocks注释的类的方法存根?