如何解决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 举报,一经查实,本站将立刻删除。