Java JUnit的代码覆盖率

Java JUnit的代码覆盖率,java,junit,cobertura,Java,Junit,Cobertura,我正在为一个方法编写一个JUnit测试用例,并且我还试图获得代码覆盖率。我现有的测试应该涵盖该场景,但出于某种原因,它在cobertura报告中仍然显示为红色 待测试的方法 public <T extends BaseServiceResponse> T postProcess(T response, ClientResponse clientResponse) throws EISClientException { List<Message>

我正在为一个方法编写一个JUnit测试用例,并且我还试图获得代码覆盖率。我现有的测试应该涵盖该场景,但出于某种原因,它在cobertura报告中仍然显示为红色

待测试的方法

public <T extends BaseServiceResponse> T postProcess(T response,
        ClientResponse clientResponse) throws EISClientException {  

    List<Message> messages = response.getMessages();
    if(messages==null || messages.size()==0) {
        return response;
    }

    Map<String, Message> messagesMap = populateMessages(response.getMessages());
    ConditionOperator condition = getCondition();

    switch(condition) {
        case OR:
            checkORCondition( messagesMap );
            break;
        case AND:
            checkANDCondition( messagesMap );
            break;
    }       
    return response;
}   
public T后处理(T响应,
ClientResponse ClientResponse)抛出EISClientException{
List messages=response.getMessages();
if(messages==null | | messages.size()==0){
返回响应;
}
Map messagesMap=populateMessages(response.getMessages());
ConditionOperator条件=getCondition();
开关(条件){
案例或:
检查条件(messagesMap);
打破
案例和:
检查和条件(messagesMap);
打破
}       
返回响应;
}   
JUnit测试用例:

@Test
public void testPostProcess() throws Exception {
    clientResponse = mock(ClientResponse.class);
    RetrieveBillingServiceResponse response = new RetrieveBillingServiceResponse();

    // Testing OR condition (200 status code)
    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));

    RetrieveBillingServiceResponse serviceResponse = postProcessFilter.postProcess(response, clientResponse);

    assertNotNull(serviceResponse.getMessages());
    assertEquals(1, serviceResponse.getMessages().size());
    assertTrue(serviceResponse instanceof RetrieveBillingServiceResponse);
    assertFalse(serviceResponse.getMessages().isEmpty());
    assertEquals("200", serviceResponse.getMessages().get(0).getMessageCode());
    assertEquals("Service completed successfully", serviceResponse.getMessages().get(0).getMessageText());
    assertEquals(MessageTypeEnum.MESSAGE_TYPE_INFO, serviceResponse.getMessages().get(0).getMessageType());     

    // Testing OR condition (404 status code)
    message.setMessageCode("404");
    message.setMessageText("request not found");
    message.setMessageType(MessageTypeEnum.MESSAGE_TYPE_INFO);

    response.setMessages(Arrays.asList(message));
    serviceResponse = postProcessFilter.postProcess(response, clientResponse);

    assertNotNull(serviceResponse.getMessages());
    assertFalse(serviceResponse.getMessages().isEmpty());
    assertEquals(1, serviceResponse.getMessages().size());
    assertEquals("404", serviceResponse.getMessages().get(0).getMessageCode());
    assertEquals("request not found", serviceResponse.getMessages().get(0).getMessageText());
    assertEquals(MessageTypeEnum.MESSAGE_TYPE_INFO, serviceResponse.getMessages().get(0).getMessageType());     

    /**
     * Testing AND condition
     * Catching EISClientException
     */
    boolean caughtException = false;
    try {
        postProcessFilter.setCondition(ConditionOperator.AND);

        List<String> myMessages = new ArrayList<String>();
        myMessages.add("200");
        myMessages.add("400");

        serviceResponse = postProcessFilter.postProcess(response, clientResponse);

        assertNotNull(serviceResponse.getMessages());
        assertEquals("400", postProcessFilter.getMessageCodes());

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

    // Null messages
    postProcessFilter.setCondition(ConditionOperator.OR);

    List<Message> myList = new ArrayList<Message>();
    message.setMessageCode(null);

    serviceResponse = postProcessFilter.postProcess(response, clientResponse);

    assertEquals(0, myList.size());
    assertEquals(null, serviceResponse.getMessages().get(0).getMessageCode());
}   
@测试
public void testPostProcess()引发异常{
clientResponse=mock(clientResponse.class);
RetrieveBillingServiceResponse响应=新建RetrieveBillingServiceResponse();
//测试或状态(200状态代码)
MessageToExceptionPostProcessFilter postProcessFilter=新MessageToExceptionPostProcessFilter();
postProcessFilter.setCondition(ConditionOperator.OR);
消息消息=新消息();
message.setMessageCode(“200”);
message.setMessageType(MessageTypeEnum.message\u TYPE\u INFO);
message.setMessageText(“服务成功完成”);
response.setMessages(Arrays.asList(message));
RetrieveBillingServiceResponse serviceResponse=postProcessFilter.postProcess(响应,clientResponse);
assertNotNull(serviceResponse.getMessages());
assertEquals(1,serviceResponse.getMessages().size());
assertTrue(RetrieveBillingServiceResponse的服务响应实例);
assertFalse(serviceResponse.getMessages().isEmpty());
assertEquals(“200”,serviceResponse.getMessages().get(0.getMessageCode());
assertEquals(“服务成功完成”,serviceResponse.getMessages().get(0.getMessageText());
assertEquals(MessageTypeEnum.MESSAGE_TYPE_INFO,serviceResponse.getMessages().get(0.getMessageType());
//测试或状态(404状态代码)
message.setMessageCode(“404”);
message.setMessageText(“未找到请求”);
message.setMessageType(MessageTypeEnum.message\u TYPE\u INFO);
response.setMessages(Arrays.asList(message));
serviceResponse=postProcessFilter.postProcess(响应,clientResponse);
assertNotNull(serviceResponse.getMessages());
assertFalse(serviceResponse.getMessages().isEmpty());
assertEquals(1,serviceResponse.getMessages().size());
assertEquals(“404”,serviceResponse.getMessages().get(0.getMessageCode());
assertEquals(“未找到请求”,serviceResponse.getMessages().get(0.getMessageText());
assertEquals(MessageTypeEnum.MESSAGE_TYPE_INFO,serviceResponse.getMessages().get(0.getMessageType());
/**
*测试和条件
*捕获客户异常
*/
布尔caughtException=false;
试一试{
postProcessFilter.setCondition(条件运算符和);
List myMessages=new ArrayList();
myMessages.add(“200”);
myMessages.add(“400”);
serviceResponse=postProcessFilter.postProcess(响应,clientResponse);
assertNotNull(serviceResponse.getMessages());
assertEquals(“400”,postProcessFilter.getMessageCodes());
}捕获(EISClientException例外){
caughtException=true;
assertEquals(“所有指定的消息代码都匹配返回的错误。”,例如getMessage());
}
资产真实性(caughtException);
//空消息
postProcessFilter.setCondition(ConditionOperator.OR);
List myList=new ArrayList();
message.setMessageCode(空);
serviceResponse=postProcessFilter.postProcess(响应,clientResponse);
assertEquals(0,myList.size());
assertEquals(null,serviceResponse.getMessages().get(0.getMessageCode());
}   
我无法涵盖message==null | | message.size==0的if语句

任何帮助都将不胜感激。这应该是简单的消息不为空,我现有的代码应该已经涵盖了它,但我不知道我做错了什么

谢谢

优素福

为了进入该代码块,您需要or语句中至少有一个条件为true;让我们检查两个条件

首先,传递到
postProcess()
方法中的响应对象总是有一个消息列表,这就是为什么没有满足第一个条件
messages==null

其次,您的消息列表不是空的(您已经添加了消息作为测试的一部分,并且从未清除它们),因此第二个条件
messages.size()==0
没有得到满足


修正:如果你清除了response中的所有消息,比如用
response.setMessages(null)
,它将进入
If
块,代码覆盖率将识别它。

完美,它工作了。所以将来我必须测试这两种情况。非常感谢你,布莱恩。