java - Junit 测试 JAXBContext 以抛出 JAXBException - 使用 mockito 测试失败场景
问题描述
我有一个测试 jaxbexception 的方法,在这个方法之前有初始验证,所以我不能发送无效请求来发生 JAXBException。我看到的唯一方法是使用 MOCKITO,尝试过但对我不起作用。
待测方法:
private String methodtoBeTested(Object request, Class clazz)
{
try
{
StringWriter sw = new StringWriter();
JAXBContext jaxbContext = JAXBContext.newInstance(clazz);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
jaxbMarshaller.marshal(request, sw);
return sw.toString();
}
catch(JAXBException e)
{
LOG.error("jaxbexception encountered" + e.getMessage());
}
}
到目前为止,我尝试过:
JAXBContext jaxbMock = mock(JAXBContext.class);
Marshaller marshalmock = mock(Marshaller.class);
when(jaxbMock.createMarshaller()).thenThrow(JAXBException.class);
解决方案
这里的问题JAXBContext jaxbContext = JAXBContext.newInstance(clazz);
是调用一个静态方法JAXBContext
,你不能Mockito
用来模拟它。你可以使用PowerMockito
,但也许这是矫枉过正。
您可以测试它是否为否定的一种方法是找到Class
它不能与它一起使用的一个 - 例如,一个没有 JAXB 注释,或者是私有的,或者一个内部类,或者它自然不喜欢的其他东西。使用真正失败的输入调用此方法,将比模拟失败更好地测试您的错误处理,这可能无法真实反映现实生活中的失败。
或者,将这个特定的代码微模块放在接口后面,并模拟整个接口,以使您能够测试它的调用者如何处理它遇到错误。
推荐阅读
- architecture - 如何将 HTML/CSS/JS 存储在数据库中,或者基本上为每个用户构建独特的页面?
- jenkins-pipeline - 使用 Jenkins 对项目列表(可能在文件中)执行相同的工作流
- python - Google 使用 python 抓取 - 请求:如何避免因请求过多而被阻止?
- web-services - 资源文件在tomcat webservice操作后不显示更改
- javascript - 获取特定参数为空的数组中的第一项
- asp.net - microsoft 3rd 方身份验证 live.com 而不是 microsoftonline.com
- reactjs - “ReactJs”重置状态但不重置唯一 ID
- python - 处理 ValueError 的便捷方法:无法从重复轴重新索引
- r - 使用查找表(或数据字典)重命名多个 data_frames 的变量
- javascript - 如何使用 javascript 将 SYN 数据包发送到 Web 服务器?