java - 如何在 Junit 测试中覆盖 catch 块?
问题描述
我正在尝试将测试课程覆盖到 100%。但是,我只能做到 90%,因为我无法测试 catch 块。谁能告诉我如何覆盖捕获块。
以下是我要测试的课程:
public class UnsubscribeXmlTransformer {
public Map<String, Object> process(Map<String, Object> requestMap) {
String inputStream = requestMap.get(NeoConstants.INPUTSTREAM).toString();
Smooks smooks;
try {
smooks = new Smooks("Unsubscribe-smooks.xml");
JavaResult javaResult = new JavaResult();
smooks.filterSource(new StringSource(inputStream), javaResult);
UnsubscribeDetailsVO unsubscribeDetailsVO = (UnsubscribeDetailsVO) javaResult
.getBean("unsubscribeDetailsVO");
requestMap.put("unsubscribeDetailsVO", unsubscribeDetailsVO);
} catch (IOException | SAXException e) { }
return requestMap;
}
}
这是我的测试课:
public class UnsubscribeXmlTransformerTest {
Map<String, Object> requestMap = null;
@Before
public void prepareRequestMap() {
requestMap = new HashMap<>();
String inputStream = "some xml tags";
requestMap.put(NeoConstants.INPUTSTREAM, inputStream);
}
@Test
public void processTest() throws Exception {
UnsubscribeXmlTransformer ref = new UnsubscribeXmlTransformer();
Map<String, Object> result = ref.process(requestMap);
Assert.assertNotNull("Result is not null", result);
Assert.assertFalse("Result is not empty", result.isEmpty());
Assert.assertTrue("Result contains key named inputStream", result.containsKey(NeoConstants.INPUTSTREAM));
Assert.assertTrue("Result contains key named unsubscribeDetailsVO", result.containsKey("unsubscribeDetailsVO"));
Assert.assertTrue("Value with key unsubscribeDetailsVO is an instance of UnsubscribeDetailsVO", result.get("unsubscribeDetailsVO") instanceof UnsubscribeDetailsVO);
}
@Test(expected = IOException.class)
public void processTestForException() {
UnsubscribeXmlTransformer ref = new UnsubscribeXmlTransformer();
// how to cover
}
}
解决方案
Mockito.spy
当应该抛出异常时,您可以在您的 requestMap 和模拟案例上使用。然后(正如jannis所指出的那样)您可以使用 AssertJ 的 fluent API 来验证没有抛出异常(您在catch
子句中将其静音),例如
@Test
public void process_shouldCatchException() throws Exception{
UnsubscribeXmlTransformer sut = new UnsubscribeXmlTransformer();
Map<String, Object> requestMap = Mockito.spy(new HashMap<>());
when(requestMap.put(eq("unsubscribeDetailsVO"), any()))
.thenThrow(IOException.class);
assertThatCode(() -> sut.process(requestMap))
.doesNotThrowAnyException();
}
推荐阅读
- javascript - Google Maps API Javascript,从页面上的表单输入中获取经度纬度
- java - 在应用程序上设置 OnClick 侦听器:搜索图标 android
- azure - 验证 Azure AD JWT 访问令牌时出错
- reactjs - 为什么我会收到有关重载调用的错误消息?
- spring-boot - 带有 SpringBoot 的 Marklogic
- cpu - 中断如何与 USB 分配器一起工作?
- r - envfit 结果是如何创建的?
- django - 我无法将 django 表单中的记录添加到数据库中
- mysql - 在 Ubuntu 18.04 中找不到 mysql 服务器 5.6.46 的 mysql_tzinfo_to_sql 命令
- linux - 将消息添加到 PostgreSQL 服务器日志文件的 SQL 查询