Java 使用JUnit的测试方法

Java 使用JUnit的测试方法,java,junit,Java,Junit,我是JUnit新手,必须使用JUnitAPI测试一个方法。一个方法内部调用另一个。我的测试用例在方法内部,但是在捕获异常时失败了 正在测试的方法是 public void checkANDCondition( Map<String, Message> messagesMap ) throws EISClientException { List<String> codes = getMessageCodes(); if(isAllReturnedMessag

我是JUnit新手,必须使用JUnitAPI测试一个方法。一个方法内部调用另一个。我的测试用例在方法内部,但是在捕获异常时失败了

正在测试的方法是

public void checkANDCondition( Map<String, Message> messagesMap ) throws EISClientException
{
    List<String> codes = getMessageCodes();
    if(isAllReturnedMessagesContainCodes(codes, messagesMap))
    {
        StringBuffer buff = new StringBuffer("All of the specified message codes matched returned errors.");
        for(String code: codes )
        {
            Message message = messagesMap.get(code);
            buff.append(message.getMessageCode() + ": " + message.getMessageType() + ": " + message.getMessageText() + " ");
        }
        throw new EISClientException(buff.toString());
    }
}

public boolean isAllReturnedMessagesContainCodes(List<String> codes, Map<String, Message> messagesMap)
{
    if(codes!=null)
    {
        for(String code: codes)
        {
            if(!messagesMap.containsKey(code))
            {
                return false;
            }
        }
    }
    return true;
}
public void checkANDCondition(映射消息Map)抛出EISClientException
{
列表代码=getMessageCodes();
if(isAllReturnedMessageContainerCodes(codes,messagesMap))
{
StringBuffer buff=新的StringBuffer(“所有指定的消息代码都匹配返回的错误”);
用于(字符串代码:代码)
{
Message Message=messagesMap.get(代码);
buff.append(message.getMessageCode()+”:“+message.getMessageType()+”:“+message.getMessageText()+”);
}
抛出新的EISClientException(buff.toString());
}
}
公共布尔值IsAllReturnedMessageContainerCodes(列表代码、映射消息映射)
{
如果(代码!=null)
{
用于(字符串代码:代码)
{
如果(!messagesMap.containsKey(代码))
{
返回false;
}
}
}
返回true;
}
到目前为止,我所做的是

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

    MessageToExceptionPostProcessFilter postProcessFilter = new MessageToExceptionPostProcessFilter();
    RetrieveBillingServiceResponse serviceResponse = new RetrieveBillingServiceResponse();caughtException = false;
    try {
        postProcessFilter.setCondition(ConditionOperator.AND);

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

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

        serviceResponse.setMessages(Arrays.asList(message));
        postProcessFilter.setMessageCodes(messagesCodes);

        serviceResponse = postProcessFilter.postProcess(serviceResponse, clientResponse);

        assertNotNull(serviceResponse.getMessages());

    } catch (EISClientException ex) {
        caughtException = true;
        assertEquals("All of the specified message codes matched returned errors.", ex.getMessage());
    }
    assertTrue(caughtException);
@测试
public void testPostProcess()引发异常{
clientResponse=mock(clientResponse.class);
MessageToExceptionPostProcessFilter postProcessFilter=新MessageToExceptionPostProcessFilter();
RetrieveBillingServiceResponse serviceResponse=新建RetrieveBillingServiceResponse();caughtException=false;
试一试{
postProcessFilter.setCondition(条件运算符和);
List messagesCodes=new ArrayList();
添加(“200”);
添加(“400”);
消息消息=新消息();
message.setMessageCode(“200”);
message.setMessageType(MessageTypeEnum.message\u TYPE\u INFO);
message.setMessageText(“服务成功完成”);
setMessages(Arrays.asList(message));
postProcessFilter.setMessageCodes(messagesCodes);
serviceResponse=postProcessFilter.postProcess(serviceResponse,clientResponse);
assertNotNull(serviceResponse.getMessages());
}捕获(EISClientException例外){
caughtException=true;
assertEquals(“所有指定的消息代码都匹配返回的错误。”,例如getMessage());
}
资产真实性(caughtException);
}

我怎样才能通过呢

谢谢

这样您就不需要捕获,如果它没有得到抛出一个EISClientException,它将失败

编辑:有两次我能想到你不想用这个的地方

1) 您正在模拟抛出的异常
mock(exception.class)
我相信这会抛出一些Mockito例外,它不会匹配预期的异常

2) 您正在代码中包装捕获的异常,并抛出一个泛型异常。代码示例:

try {
} catch (FileParseException e){

throw new (ProjectFailingException(e, "file is bad");
}
如果您有多个捕获并将它们包装为ProjectFailingExceptions,那么您可能希望在测试中像这样捕获

@Test ( expected = FileParseException.class)
public void testProcess() {
try {
...
} catch (ProjectFailingException e){
throw e.getCause();
}

然后抛出适当的异常,您可以确保该进程没有从其他捕获中抛出异常

测试代码与测试中的方法无关。您可以发布相关的测试代码吗?为什么不直接使用@test(expected=EISClientException.class)?@Nolexa:这是相关的测试。我忘了更改方法的名称。我尝试过@Test(expected=EISClientException.class),但得到了相同的错误。我没有看到在单元测试中调用checkAndCondition方法。另外,请发布您的异常stacktrace。您得到的错误是什么。额外的好处是:您也不需要在测试体中有任何断言,因为异常就是断言。您不需要调用Assert.fail。我通常添加Assert.fail,因为它使我更容易在将来返回并阅读测试。
@Test ( expected = FileParseException.class)
public void testProcess() {
try {
...
} catch (ProjectFailingException e){
throw e.getCause();
}