调试时,我使用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)方法添加定义.