【问题标题】:How to call @RestControllerAdvice class from a unit test in the Service layer of a REST web service in java?java - 如何从Java中REST Web服务的服务层的单元测试中调用@RestControllerAdvice类?
【发布时间】:2026-01-21 17:20:05
【问题描述】:

我有一个 REST 网络服务应用程序。我正在使用注释@ExceptionHandler 和@RestControllerAdvice 通过异常处理程序处理异常。我的异常是在服务层中抛出的。现在我正在为服务层编写单元测试。我正在使用 Assert.assertThrows 检查异常。抛出异常,测试通过。但是,抛出异常时不会调用异常处理程序方法。我需要在单元测试期间调用异常处理程序方法。测试类和ExceptionHandler类如下。

@RunWith(SpringRunner.class)
public class ServiceTest {

  @InjectMocks
  private Service testService = new ServiceImpl();

  @Mock
  private Repository repository; 
 

  @Test
  public void testException() {
    assertThrows(
        Exception.class, ()->{
          // Code that throws exception.
        });
  }
}

@RestControllerAdvice
public class ExceptionHandler {

  @ExceptionHandler(Exception.class)
  public ResponseEntity<Object> handleUnknownException(Exception ex) {
    return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
               .body("Body Here");
  }

}

【问题讨论】:

    标签: java spring


    【解决方案1】:

    @RestControllerAdvice 是一种由 @RestController 注释的类引发的异常的拦截器,这就是为什么不会为您的测试方案调用异常处理程序方法的原因。

    要测试它,您应该为您的控制器编写一个测试,使用 mockMvc 并使用它注册您的 exceptionHandler 类,如下所示。希望,它会有所帮助。

    this.mockMvc = MockMvcBuilders.standaloneSetup(new YourController()).setControllerAdvice(ExceptionHandler.class)
                    .build();
    

    【讨论】: