From fcc318aa4e87152851a2b3df59742a833a32c39a Mon Sep 17 00:00:00 2001 From: mabofu Date: Thu, 27 Mar 2025 17:05:41 +0800 Subject: [PATCH] Fixed code coverage: fixed GlobalExceptionHandler code coverage --- .../handler/GlobalExceptionHandlerTest.java | 142 ++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100644 dsms-engine-application/src/test/java/com/dsms/common/handler/GlobalExceptionHandlerTest.java diff --git a/dsms-engine-application/src/test/java/com/dsms/common/handler/GlobalExceptionHandlerTest.java b/dsms-engine-application/src/test/java/com/dsms/common/handler/GlobalExceptionHandlerTest.java new file mode 100644 index 00000000..668835fd --- /dev/null +++ b/dsms-engine-application/src/test/java/com/dsms/common/handler/GlobalExceptionHandlerTest.java @@ -0,0 +1,142 @@ +package com.dsms.common.handler; + +import com.dsms.common.constant.ResultCode; +import com.dsms.common.exception.DsmsEngineException; +import com.dsms.common.model.Result; +import com.dsms.common.taskmanager.model.Task; +import com.dsms.modules.storagepool.controller.StoragePoolController; +import com.dsms.modules.storagepool.model.vo.StoragePoolCreateVO; +import com.fasterxml.jackson.databind.JsonMappingException.Reference; +import com.fasterxml.jackson.databind.exc.InvalidFormatException; +import java.net.SocketException; +import java.sql.SQLException; +import java.util.List; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import lombok.SneakyThrows; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.springframework.core.MethodParameter; +import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.validation.BeanPropertyBindingResult; +import org.springframework.validation.FieldError; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.MissingServletRequestParameterException; +import org.springframework.web.servlet.NoHandlerFoundException; + +class GlobalExceptionHandlerTest { + + private String errorMessage = "非法的请求参数"; + GlobalExceptionHandler globalExceptionHandler = new GlobalExceptionHandler(); + HttpServletRequest request = Mockito.mock(HttpServletRequest.class); + HttpServletResponse response = Mockito.mock(HttpServletResponse.class); + + @Test + @SneakyThrows + void testExceptionHandler() { + + DsmsEngineException dsmsEngineException = new DsmsEngineException(ResultCode.REMOTE_CALL_FAIL); + Result dsmsEngineExceptionResult = globalExceptionHandler.exceptionHandler(dsmsEngineException, response); + Assertions.assertEquals(ResultCode.REMOTE_CALL_FAIL.getCode(), dsmsEngineExceptionResult.getCode()); + Assertions.assertEquals(ResultCode.REMOTE_CALL_FAIL.getMessage(), dsmsEngineExceptionResult.getMessage()); + + SQLException sqlException = new SQLException(); + Result sqlExceptionResult = globalExceptionHandler.exceptionHandler(sqlException, response); + Assertions.assertEquals(ResultCode.DATABASE_ERROR.getCode(), sqlExceptionResult.getCode()); + Assertions.assertEquals(ResultCode.DATABASE_ERROR.getMessage(), sqlExceptionResult.getMessage()); + + SocketException socketException = new SocketException(); + Result socketExceptionResult = globalExceptionHandler.exceptionHandler(socketException, response); + Assertions.assertEquals(ResultCode.SOCKET_ERROR.getCode(), socketExceptionResult.getCode()); + Assertions.assertEquals(ResultCode.SOCKET_ERROR.getMessage(), socketExceptionResult.getMessage()); + + RuntimeException runtimeException = new RuntimeException(); + Result runtimeExceptionResult = globalExceptionHandler.exceptionHandler(runtimeException, response); + Assertions.assertEquals(ResultCode.SERVER_ERROR.getCode(), runtimeExceptionResult.getCode()); + Assertions.assertEquals(ResultCode.SERVER_ERROR.getMessage(), runtimeExceptionResult.getMessage()); + + String repeat = "i".repeat(100); + RuntimeException runtimeExceptionTooLong = new RuntimeException(repeat); + Result runtimeExceptionTooLongResult = globalExceptionHandler.exceptionHandler(runtimeExceptionTooLong, response); + Assertions.assertEquals(ResultCode.SERVER_ERROR.getCode(), runtimeExceptionTooLongResult.getCode()); + Assertions.assertEquals(ResultCode.SERVER_ERROR.getMessage(), runtimeExceptionTooLongResult.getMessage()); + + String repeat1 = "i".repeat(99); + RuntimeException runtimeExceptionShort = new RuntimeException(repeat1); + Result runtimeExceptionShortResult = globalExceptionHandler.exceptionHandler(runtimeExceptionShort, response); + Assertions.assertEquals(ResultCode.SERVER_ERROR.getCode(), runtimeExceptionShortResult.getCode()); + Assertions.assertEquals(repeat1, runtimeExceptionShortResult.getMessage()); + } + + @Test + @SneakyThrows + void testHttpMessageNotReadableHandler() { + HttpMessageNotReadableException mock = Mockito.mock(HttpMessageNotReadableException.class); + InvalidFormatException mock1 = Mockito.mock(InvalidFormatException.class); + Reference mock2 = Mockito.mock(Reference.class); + + Result objectResult = globalExceptionHandler.httpMessageNotReadableExceptionHandler(mock); + Assertions.assertEquals(ResultCode.BAD_REQUEST.getCode(), objectResult.getCode()); + Assertions.assertEquals(errorMessage, objectResult.getMessage()); + + Mockito.when(mock.getCause()).thenReturn(mock1); + Mockito.when(mock1.getPath()).thenReturn(List.of(mock2)); + Mockito.when(mock2.getFieldName()).thenReturn("replicaNum"); + Mockito.when(mock2.getFrom()).thenReturn(new StoragePoolCreateVO()); + + Result objectResult0 = globalExceptionHandler.httpMessageNotReadableExceptionHandler(mock); + Assertions.assertEquals(ResultCode.BAD_REQUEST.getCode(), objectResult0.getCode()); + Assertions.assertEquals("副本数" + errorMessage, objectResult0.getMessage()); + + Mockito.when(mock2.getFieldName()).thenReturn("replicaNum"); + + Result objectResult1 = globalExceptionHandler.httpMessageNotReadableExceptionHandler(mock); + Assertions.assertEquals(ResultCode.BAD_REQUEST.getCode(), objectResult1.getCode()); + Assertions.assertEquals("副本数" + errorMessage, objectResult1.getMessage()); + + Mockito.when(mock1.getValue()).thenReturn("1"); + Result objectResult2 = globalExceptionHandler.httpMessageNotReadableExceptionHandler(mock); + Assertions.assertEquals(ResultCode.BAD_REQUEST.getCode(), objectResult2.getCode()); + Assertions.assertEquals("副本数" + "超出数字最大范围", objectResult2.getMessage()); + + Mockito.when(mock2.getFieldName()).thenReturn("poolName"); + Result objectResult3 = globalExceptionHandler.httpMessageNotReadableExceptionHandler(mock); + Assertions.assertEquals(ResultCode.BAD_REQUEST.getCode(), objectResult3.getCode()); + Assertions.assertEquals("存储池名称" + errorMessage, objectResult3.getMessage()); + + Mockito.when(mock2.getFrom()).thenReturn(new Task()); + Mockito.when(mock2.getFieldName()).thenReturn("id"); + Result objectResult5 = globalExceptionHandler.httpMessageNotReadableExceptionHandler(mock); + Assertions.assertEquals(ResultCode.BAD_REQUEST.getCode(), objectResult5.getCode()); + Assertions.assertEquals("超出数字最大范围", objectResult5.getMessage()); + + Mockito.when(mock1.getPath()).thenThrow(new RuntimeException()); + Result objectResult4 = globalExceptionHandler.httpMessageNotReadableExceptionHandler(mock); + Assertions.assertEquals(ResultCode.BAD_REQUEST.getCode(), objectResult4.getCode()); + Assertions.assertEquals(errorMessage, objectResult4.getMessage()); + } + + @Test + @SneakyThrows + void testOtherExceptionHandler() { + Result objectResult2 = globalExceptionHandler.noHandlerFoundExceptionHandler(request, new NoHandlerFoundException(null, null, null)); + Assertions.assertEquals(ResultCode.NOT_FOUND.getCode(), objectResult2.getCode()); + + Result objectResult3 = globalExceptionHandler.missingServletRequestParameterExceptionHandler(new MissingServletRequestParameterException(null, null)); + Assertions.assertEquals(ResultCode.BAD_REQUEST.getCode(), objectResult3.getCode()); + + BeanPropertyBindingResult storagePoolCreateVO = new BeanPropertyBindingResult(new StoragePoolCreateVO(), "storagePoolCreateVO"); + MethodArgumentNotValidException create = new MethodArgumentNotValidException(new MethodParameter(StoragePoolController.class.getMethod("create", StoragePoolCreateVO.class), 0), storagePoolCreateVO); + Result objectResult4 = globalExceptionHandler.methodArgumentNotValidExceptionHandle(create); + Assertions.assertEquals(ResultCode.BAD_REQUEST.getCode(), objectResult4.getCode()); + Assertions.assertEquals("请求参数有误", objectResult4.getMessage()); + + storagePoolCreateVO.addError(new FieldError("storagePoolCreateVO", "poolName", "存储池名称不能为空")); + MethodArgumentNotValidException create1 = new MethodArgumentNotValidException(new MethodParameter(StoragePoolController.class.getMethod("create", StoragePoolCreateVO.class), 0), storagePoolCreateVO); + Result objectResult5 = globalExceptionHandler.methodArgumentNotValidExceptionHandle(create1); + Assertions.assertEquals(ResultCode.BAD_REQUEST.getCode(), objectResult5.getCode()); + Assertions.assertEquals("存储池名称不能为空", objectResult5.getMessage()); + } + +} \ No newline at end of file -- Gitee