使用JUnit捕获异常

时间:2016-02-03 22:10:17

标签: java junit

我正在为一个方法编写JUnit测试用例并增强我的Cobertura分支覆盖率我想捕获异常,但不确定为什么测试没有捕获异常。

待测试方法:

 public void getCondition( Map<String, Message> messagesMap ) throws EISClientException
{
    Message message = containsAMessageCode(getMessageCodes(), messagesMap);
    if(message!=null)
    {
        throw new EISClientException("One of the specified message code matched returned errors." + 
                message.getMessageCode() + ": " + message.getMessageType() + ": " + message.getMessageText());

    }
}

JUnit测试:

@Test
public void testgetCondition() throws Exception {
    boolean caughtException = false;
    try {
        clientResponse = mock(ClientResponse.class);
        RetrieveBillingServiceResponse response = new RetrieveBillingServiceResponse();

        MessageToExceptionPostProcessFilter postProcessFilter = new MessageToExceptionPostProcessFilter();
        postProcessFilter.setCondition(ConditionOperator.OR);

        Message message = new Message();
        message.setMessageCode("200");
        message.setMessageType(MessageTypeEnum.MESSAGE_TYPE_INFO);
        message.setMessageText("Service completed successfully");

        response.setMessages(Arrays.asList(message));

        Map<String, Message> map = new HashMap<String, Message>();
        map.put("test", message);

        RetrieveBillingServiceResponse serviceResponse = postProcessFilter.getCondition(map);

    } catch (EISClientException ex) {
        caughtException = true;
        assertEquals("One of the specified message code matched returned errors.", ex.getMessage());
    }
    assertTrue(caughtException);
}

如果消息不为null,则应捕获异常但不是。我做错了吗?

谢谢,

4 个答案:

答案 0 :(得分:1)

另一种测试预期异常的方法是在导致异常的测试代码行之后有一个fail()。

如果抛出异常,则跳转到catch并且永远不会调用fail(),如果没有抛出异常,则fail()在应该抛出异常并且测试失败的行之后执行。

另外,查看当前的assertEquals() - 您要比较的String与您在创建Exception时构建的String不同。

答案 1 :(得分:0)

  1. @yole是对的。你还没有调用被测方法。
  2. 实现相同目标的更好方法是使用@Test(expected = .class)注释 - 当然 - 您将无法检查消息。但在你的情况下,测试中的方法只抛出一个异常 - 所以只要你测试它抛出异常 - 它应该没问题。不用说cobertura - 会很高兴! 这是一个教程: http://www.mkyong.com/unittest/junit-4-tutorial-2-expected-exception-test/

答案 2 :(得分:0)

你确定你的测试在哪里调用getCondition()方法吗?我没有从你的代码中看到它。但如果您确定已调用getCondition(),请尝试使用!message.isEmpty()代替message!=null

答案 3 :(得分:0)

这里有一些不合适的事情:

  1. 为此类测试使用正确的注释

    @Test(expected = EISClientException.class)

  2. 在单元测试中使用多个断言是一种不好的做法。见1 - 应该修复它。

  3. containsAMessageCode(getMessageCodes(),messagesMap)怎么样; 。你确定这不是返回null吗?如果你真的想要单元测试 getCondition 方法,你应该将该调用短路。

  4. catch(EISClientException ex){...}中的 assertEquals 似乎不正常。您正在使用更复杂的消息抛出异常,因为您的代码现在看起来不会是真的。