繁体   English   中英

如何从java中的REST web服务的Service层中的单元测试中调用@RestControllerAdvice class?

[英]How to call @RestControllerAdvice class from a unit test in the Service layer of a REST web service in java?

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

@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");
  }

}

@RestControllerAdvice是 class 抛出的异常的拦截器,用 @RestController 注释,这就是为什么没有为您的测试方案调用异常处理程序方法的原因。

要对此进行测试,您应该为您的 controller 编写一个测试,使用 mockMvc 并使用它注册您的异常处理程序 class,如下所示。 希望能帮助到你。

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

[非常晚的回答] 您不需要显式调用您的@RestControllerAdvice因为一旦您的代码中出现异常,它就会被调用。 您应该尝试以这种方式处理您的异常:

@GetMapping("/personality")
public ResponseEntity<Response> computePersonality(@Valid @RequestBody Dto dto) throws BadRequestException {
    try {
            // any other mapping or code
            var response = yourService.yourMethod(dto);
            // any other mapping or code
            return ResponseEntity.status(HttpStatus.OK).body(response);
    } catch (NumerologyValidationException exception) {
        throw new BadRequestException("An error occurs...", exception);
    }
}

在这里,你的 controller 只理解 HTTP 代码响应,你所有的异常都应该重定向到@RestControllerAdvice 检查此链接以获取有关4XX5XX错误代码管理的更多详细信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM