繁体   English   中英

为什么Mockito对InputStreams表现得很奇怪?

[英]Why is Mockito behaving weird with 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());
}

任何帮助理解mockito方法失败的方式和原因都会很棒。

如果查看ByteStreams实现,可以看到使用了read(buf)方法。 在你的情况下,它返回null,因为它没有模拟定义,这导致复制方法中的无限循环。

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

当你没有存根时,你会想要设置你的模拟来调用InputStream的真正方法

final InputStream mis = Mockito.mock(InputStream.class, Mockito.CALLS_REAL_METHODS);

javadoc

在使用遗留代码时,此实现很有用。 使用此实现时, 未被取消的方法将委托给实际实现。 这是一种创建默认情况下调用实际方法的部分模拟对象的方法。

默认情况下,Mockito嘲笑一切。 您首先使用的ByteStreams#copy方法调用InputStream#read(byte[]) 由于mockito已经嘲笑它,它将返回0, ByteStreams#copy解释为“还有更多要从此流中读取”并继续读取(无限循环)。

通过使用Mockito.CALLS_REAL_METHODS ,你告诉Mockito调用InputStream的实际实现,它将委托给read() ,你已经存根以引发异常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM