java - 如何在 Junit 测试中覆盖 catch block ?

标签 java unit-testing mockito junit4

我正试图将测试类(class)覆盖到 100%。但是,由于我无法测试 catch block ,所以我最多只能做到 90%。谁能告诉我如何覆盖 catch block 。

下面是我要测试的类:

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                 
    }
}

最佳答案

您可以在您的 requestMap 上使用 Mockito.spy,并在应该抛出异常时模拟案例。然后(如 jannis 所指出的)您可以使用 AssertJ 的流畅 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();
}

关于java - 如何在 Junit 测试中覆盖 catch block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52438909/

相关文章:

java - 测试用例运行时不会调用 Rx onErrorReturn

java - 我如何强制 JGroups 将哪个节点设为协调器?

java - 采用 Supplier<String> 方法的模拟方法不起作用

java - 如何测试需要外部休息调用的方法?

java - Maven 在构建 Java 项目时运行带有 junit @Ignore 注释的测试

javascript - 我如何同时 stub 和监视

java - 如何模拟接口(interface)?

java - WebSockets 与长轮询与 TCP 可扩展性/易用性

java - 从 LinkedList 索引处删除一个元素

java - 将 POJO 与带有 JAXB 和 Solr 注释的嵌套类一起使用