在方法内部调用方法时模拟异常

sg3maiej  于 2021-07-06  发布在  Java
关注(0)|答案(2)|浏览(373)

我有这段代码,当try块中的close方法被调用时,我想用mockito抛出一个ioexception

public static void cleanup(Logger log, Closeable... closeables) {
        for (Closeable c : closeables) {
            if (c != null) {
                try {
                    c.close();
                } catch (IOException e) {
                    if (log != null) {
                        log.warn("Exception in closing " + c, e);
                    }
                }
            }
        }
    }

这是我在测试方法中尝试的,但显然不起作用:

OutputStream outputStream = Mockito.mock(OutputStream.class);
doThrow(new IOException()).when(outputStream).close();

cleanup(log, closeables);

我怎样才能实现我的目标?谢谢!

vhmi4jdf

vhmi4jdf1#

您需要确保将mock作为第二个参数传递给 cleanup 方法。
以下测试对我有效:

@Test
    public void testException() throws IOException {
        OutputStream outputStream = Mockito.mock(OutputStream.class);
        doThrow(new IOException()).when(outputStream).close();
        cleanup(log, outputStream);

        Mockito.verify(outputStream, times(1)).close(); // make sure #close method is called once
    }

这个 cleanup 方法看起来是正确的。无需更改。

b1zrtrql

b1zrtrql2#

我对这个词的用法做了一些研究 doThrow(new Exception()) 在javadoc mockito文档中。这段核心文档告诉我,为了让存根对象抛出异常,语法是 when(yourStub.method()).doThrow(new Exception()) 对于返回void和 when(yourStub.method()).thenThrow(new Exception()) 对于返回除void以外的任何内容的方法。简而言之,配置抛出异常的调用应该是 when(outputStream.close()).doThrow(new IOException()) .
此外,您需要将outputstream作为第二个参数传递给cleanup函数,正如petr在回答中指出的那样。另外,如果您计划向cleanup函数传递一个closable,那么它可能需要重构以获取一个closable,而不是一个closable集合,就像您的问题一样。

相关问题