You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法编写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);
    }
}

说明

  1. 使用@Mock注解模拟WebRequest对象,通过when()指定getDescription()的返回值,避免空指针。
  2. 构造真实的Exception对象传入,确保ex.getMessage()能正常返回值。
  3. 补充@ControllerAdvice注解,保证全局异常处理器能被Spring识别生效。
  4. 可选的响应头断言可以让测试覆盖更多场景,验证结果的准确性。

内容的提问来源于stack exchange,提问作者Abhishek Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 14:15:42