Java 如何为异常编写Junit

Java 如何为异常编写Junit,java,junit,Java,Junit,我的类包含以下handleException方法,我必须为其编写具有完整代码覆盖率的JUnit。因为我是新手,有人能帮我吗 public void handleException(Exception exception, DCMRequestDTO requestDTO, DCMResponseDTO responseDTO, String callType) { logger.error("Exception occured for deviceId:" + requestDTO.ge

我的类包含以下handleException方法,我必须为其编写具有完整代码覆盖率的JUnit。因为我是新手,有人能帮我吗

public void handleException(Exception exception, DCMRequestDTO requestDTO, DCMResponseDTO responseDTO, String callType) {
    logger.error("Exception occured for deviceId:" + requestDTO.getDeviceID() + ",RefNum:"+
            requestDTO.getRefNum() + ",Operation:" + requestDTO.getOperation() + "::" + exception.getMessage());
    exception.printStackTrace();
    String errorMessageKey = "GENERIC_EXCEPTION";
    if (exception instanceof TooManyInflightException) {
        errorMessageKey = "THROTTLE_EXCEPTION";
    } else if (exception.getCause() instanceof SocketTimeoutException ||
            (exception.getCause() != null && exception.getCause().getCause() instanceof SocketTimeoutException)) {
        errorMessageKey = "TIMEOUT_EXCEPTION";
    } else if (exception.getCause().getCause() instanceof ConnectException || exception.getCause().getCause() instanceof ConnectTimeoutException || exception.getCause().getCause() instanceof UnknownHostException || exception.getCause().getCause() instanceof MalformedURLException || exception.getCause().getCause() instanceof SocketException || (exception.getMessage().indexOf("404 Error") != -1)) {
        errorMessageKey = "CONNECTION_EXCEPTION";
    } else if(exception.getMessage().indexOf("500")!=-1){
        errorMessageKey = "INTERNAL_ERROR";
    }
    /*
     * else if (exception instanceof DCMException) { if (exception.getCause().getCause() instanceof SocketTimeoutException) { errorMessageKey = "TIMEOUT_EXCEPTION"; } else if (exception.getCause().getCause() instanceof ConnectException || exception.getCause().getCause() instanceof IOException || exception.getCause().getCause() instanceof SocketException || (exception.getMessage().indexOf("404 Error") != -1)) { errorMessageKey = "CONNECTION_EXCEPTION"; } }
     */
    // logger.error(errorMessageKey + " occured in DCMServiceImpl :: UniqueId = " + requestDTO.getUniqueId() + ", RefNum = " + requestDTO.getRefNum() + ", Operation = " + requestDTO.getOperation() + ", callType = " + callType, exception);
    // added for reset time while exception occured
    responseDTO.setErrorCode(0);
    responseDTO.setErrorString(smartGraphUtils.getProperty(errorMessageKey));
    responseDTO.setStackTrace(exception.toString());
    responseDTO.setHasJson(false);
    requestDTO.setHidResolveGetRetrains("Undetermined");
}

根据您的源代码,您需要测试中周围类的实例:然后您应该能够调用方法
handleException
。 每个测试应该(在最好的情况下)只包含一个断言。这使得您很容易理解当前正在检查的内容。 以下是一个例子:

public final class MessageBusTest {
    @Test(expected = NullPointerException.class)
    public void registerWithNullThrowsNullPointerException() {
        MessageBus.INSTANCE.register(null);
    }
}
注释
@Test
帮助JUnit找出类中哪些方法是测试。在我的示例中,我使用
null
调用一个方法,并期望抛出一个异常,因此
expected=NullPointerException.class


例如,在您的情况下,您必须为测试准备适当的
异常
,然后首先使用
assertEquals
检查
requestDTO
中的内容,即错误字符串,您的方法有许多流,您需要为方法中的每个流/条件编写测试,以确保所有场景都得到处理

下面提供了示例代码,您可以编写完整的逻辑:

import org.junit.Test;

    public class HandleExceptionText {

        @Test
        public void testHandleExceptionForTooManyInflightException()  {
            //throw TooManyInflightException exception and then call handleException()
            //Example using Mockito: when(obj.method(parms)).thenThrow(new TooManyInflightException());
            //Assert to check responseDTO values have been set
        }

        @Test
        public void testHandleExceptionForSocketTimeoutException()   {
            //throw SocketTimeoutException exception and then call handleException()
            //Example using Mockito: when(obj.method(parms)).thenThrow(new SocketTimeoutException());
            //Assert to check responseDTO values have been set
        }

        @Test
        public void testHandleExceptionForConnectTimeoutException()   {
            //throw ConnectTimeoutException exception and then call handleException()
            //Example using Mockito: when(obj.method(parms)).thenThrow(new ConnectTimeoutException());
            //Assert to check responseDTO values have been set
        }

        @Test
        public void testHandleExceptionForConnectException()   {
            //throw ConnectException exception and then call handleException()
            //Example using Mockito: when(obj.method(parms)).thenThrow(new ConnectException());
            //Assert to check responseDTO values have been set
        }

        @Test
        public void testHandleExceptionForUnknownHostException()   {
            //throw UnknownHostException exception and then call handleException()
            //Example using Mockito: when(obj.method(parms)).thenThrow(new UnknownHostException());
            //Assert to check responseDTO values have been set
        }

        @Test
        public void testHandleExceptionForMalformedURLException()   {
            //throw MalformedURLException exception and then call handleException()
            //Example using Mockito: when(obj.method(parms)).thenThrow(new MalformedURLException());
            //Assert to check responseDTO values have been set
        }

        @Test
        public void testHandleExceptionForConnectException()  {
            //throw SocketException exception and then call handleException()
            //Example using Mockito: when(obj.method(parms)).thenThrow(new SocketException());
            //Assert to check responseDTO values have been set
        }

    }
此外,我建议浏览以下JUnit和Mockito教程链接:

@Test public final void testhandleException()抛出异常{给定(smartGraphServiceHelper.generateDocument(Mockito.any(DCMRequestDTO.class)))。willThrow(new SocketTimeoutException());字符串callType=“”;smartGraphService.handleException(异常,requestDTO,responseDTO,callType);assertEquals(“0”,responseDTO.getErrorCode())}这是我尝试过的方法,但当它进入exception.getCause()内部时,会给出null指针