无法编写JUnit 5测试用例,请求协助调试全局异常处理器测试
修复全局异常处理器的JUnit 5测试用例
原测试用例的问题
- 直接传入
null作为Exception和WebRequest参数,调用ex.getMessage()和request.getDescription(true)时会触发NullPointerException,导致测试直接失败。 - 测试类命名与被测试类不统一,不符合测试规范。
- 缺少必要的依赖导入,比如
HttpStatus、Mockito模拟WebRequest所需的类。
修正后的测试用例
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.context.request.WebRequest; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) class GlobalExceptionHandlerTest { @Mock private WebRequest mockWebRequest; @Test void handleAllExceptions_ShouldReturnBadRequest() { // 准备测试数据 Exception testException = new RuntimeException("测试异常信息"); when(mockWebRequest.getDescription(true)).thenReturn("测试请求详情"); // 实例化被测试类 GlobalExceptionHandler exceptionHandler = new GlobalExceptionHandler(); // 调用目标方法 ResponseEntity<?> response = exceptionHandler.handleAllExceptions(testException, mockWebRequest); // 断言结果 assertEquals(HttpStatus.BAD_REQUEST.value(), response.getStatusCode().value()); // 可选:断言响应头内容 assertEquals("error", response.getHeaders().getFirst("exception-erro")); } }
全局异常处理器的必要修正
原处理器遗漏了@ControllerAdvice注解(否则Spring无法识别为全局异常处理器),同时日志对象存在拼写错误,修正后代码:
import java.util.Date; import java.util.HashMap; import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.context.request.WebRequest; import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; @ControllerAdvice public class GlobalExceptionHandler extends ResponseEntityExceptionHandler { protected final Log logger = LogFactory.getLog(GlobalExceptionHandler.class); @ExceptionHandler(Exception.class) ResponseEntity<?> handleAllExceptions(Exception ex, WebRequest request ) { Map<String, Object> result = new HashMap<>(); result.put("date", new Date()); result.put("message", ex.getMessage()); result.put("details", request.getDescription(true)); logger.error("全局异常捕获", ex); return ResponseEntity.badRequest() .header("exception-erro", "error") .body(result); } }
说明
- 使用
@Mock注解模拟WebRequest对象,通过when()指定getDescription()的返回值,避免空指针。 - 构造真实的
Exception对象传入,确保ex.getMessage()能正常返回值。 - 补充
@ControllerAdvice注解,保证全局异常处理器能被Spring识别生效。 - 可选的响应头断言可以让测试覆盖更多场景,验证结果的准确性。
内容的提问来源于stack exchange,提问作者Abhishek Sharma
相关产品推荐
相关产品推荐

