我正在为一个方法编写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,则应捕获异常但不是。我做错了吗?
谢谢,
答案 0 :(得分:1)
另一种测试预期异常的方法是在导致异常的测试代码行之后有一个fail()。
如果抛出异常,则跳转到catch并且永远不会调用fail(),如果没有抛出异常,则fail()在应该抛出异常并且测试失败的行之后执行。
另外,查看当前的assertEquals() - 您要比较的String与您在创建Exception时构建的String不同。
答案 1 :(得分:0)
答案 2 :(得分:0)
你确定你的测试在哪里调用getCondition()
方法吗?我没有从你的代码中看到它。但如果您确定已调用getCondition()
,请尝试使用!message.isEmpty()
代替message!=null
答案 3 :(得分:0)
这里有一些不合适的事情:
为此类测试使用正确的注释
@Test(expected = EISClientException.class)
在单元测试中使用多个断言是一种不好的做法。见1 - 应该修复它。
containsAMessageCode(getMessageCodes(),messagesMap)怎么样; 。你确定这不是返回null吗?如果你真的想要单元测试 getCondition 方法,你应该将该调用短路。
catch(EISClientException ex){...}中的 assertEquals 似乎不正常。您正在使用更复杂的消息抛出异常,因为您的代码现在看起来不会是真的。