微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Mockito doThrow() 方法使我的测试失败并出现给定的异常

如何解决Mockito doThrow() 方法使我的测试失败并出现给定的异常

我正在测试注入的 StatefulBeanToCsv 依赖项引发异常时的错误情况。但是,Mockito 的 doThrow() 方法只是让我的测试失败,而不是允许使用 assertThrows() 验证该异常。

我通过 StatefulBeanToCsv 而不是构造函数/setter 注入来注入我的 beanfactory 依赖项,因为我需要将 Writer 作为参数传递给它。

测试如下,星号处失败。 CSV bean 在我的成功测试中工作正常 - 在这种情况下我能想到的主要区别是使用 do/when Mockito 模式而不是 when/{{1 }} 在别处使用的(不允许从 void 方法抛出异常):

then

我正在测试的方法如下(我期待星号处的 void“write”方法抛出异常)。

@Test
    void willThrowSwaggerListToCsvexceptionIfCsvWriterThrowsCsvexception() throws CsvFieldAssignmentException {
        // given
        List<ApiSummary.Endpoint> endpointList = getEndpointList(6);
        doReturn(endpointBeanToCsvMock)
                .when(beanfactoryMock).getBean(eq(StatefulBeanToCsv.class),eq(ApiSummary.Endpoint.class),any(Writer.class),any(String[].class));
        doThrow(CsvFieldAssignmentException.class)
*               .when(endpointBeanToCsvMock).write(endpointList);
        // when,then
        assertThrows(SwaggerToCsvexception.class,() -> underTest.listToResource(endpointList,ApiSummary.Endpoint.class));
    }

我错过了什么吗?

编辑 - 堆栈跟踪:

public <T> ByteArrayResource listToResource(List<T> beanList,Class<T> clazz,String... columnorder) {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        try (Writer writer = new OutputStreamWriter(out)) {
            StatefulBeanToCsv<T> beanToCsv = beanfactory.getBean(StatefulBeanToCsv.class,clazz,writer,columnorder);
*           beanToCsv.write(beanList);
        } catch (CsvFieldAssignmentException | IOException e) {
            throw new SwaggerToCsvexception("Error converting List of type " + clazz.getSimpleName() + " to csv",e);
        }
        byte[] bytes = out.toByteArray();
        return new ByteArrayResource(bytes);
    }

解决方法

正如 M.Deinum 在评论中提到的,这里的错误不是抛出异常,而是 Mockito 未能实例化异常,以便为您抛出异常。

请注意,Mockito documentation 中的示例显示了正在实例化的异常 - 也就是说,doThrow() 方法正在获取异常的实例,而不是您要抛出的异常的类:

doThrow(new RuntimeException()).when(mockedList).clear();

Javadoc 确实也表明您可以提供一个类,正如您所拥有的那样,并表示它将被实例化,但没有提供有关需要哪些构造函数的详细信息。如果没有自己尝试,我猜这只会适用于具有默认(无参数)构造函数的异常。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。