我有一个REST Web服务应用程序。我使用注释@ExceptionHandler和@RestControllerAdvice通过异常处理程序处理异常。我的异常是在服务层中抛出的。现在我正在为服务层编写单元测试。我正在使用Assert.assertThrows检查异常。异常被抛出,测试通过。但是,当抛出异常时,不会调用异常处理程序方法。我需要在单元测试期间调用异常处理程序方法。Test类和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");
}
}
@RestControllerAdvice是用@RestController注释的类抛出的异常的拦截器,这就是为什么没有为测试schenario调用异常处理程序方法的原因。
为了测试这一点,你应该为你的控制器写一个测试,使用mockMvc并注册你的exceptionHandler类,如下所示。希望,它会有所帮助。
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);
}
}
在这里,您的控制器只理解HTTP代码响应,所有异常都应该重定向到@RestControllerAdvice
。有关4XX和5XX