为什么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方法中的无限循环

您可以更改默认的模拟行为,也可以手动为read(buff)方法添加定义

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章