簡體   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