【问题标题】:How to cover catch block in Junit testing?如何在 Junit 测试中覆盖 catch 块?
【发布时间】:2018-09-21 07:42:31
【问题描述】:

我正在尝试将测试课程覆盖到 100%。但是,我只能做到 90%,因为我无法测试 catch 块。谁能告诉我如何覆盖 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                 
    }
}

【问题讨论】:

    标签: java unit-testing mockito junit4


    【解决方案1】:

    您可以在您的 requestMap 和模拟案例中使用 Mockito.spy,当应该抛出异常时。然后(正如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();
    }
    

    【讨论】:

    • 缺少断言部分。我更喜欢AssertJ 断言:Assertions.assertThatCode(() -&gt; sut.process(requestMap)).doesNotThrowAnyException()
    • 对!我错过了这个。谢谢。我也更喜欢 AssertJ。
    【解决方案2】:

    这里当我们执行classUnderTest.handleError(clienthttpresponse);它将在java类中抛出异常..为了覆盖java类中catch块中的代码,我们需要在try块和Assert.fail()中编写下面的代码,而不是立即抛出错误,它将进入catch块。

    try {
                Mockito.when(clienthttpresponse.getBody()).thenReturn(targetStream);
                classUnderTest.handleError(clienthttpresponse);
                fail();
            }catch(Exception e) {
                System.out.println(e.getClass()+""+e.getMessage());
            }
    

    【讨论】:

      猜你喜欢
      • 2022-11-10
      • 2021-08-16
      • 1970-01-01
      • 1970-01-01
      • 2022-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多