如何在验证请求正文时模拟服务并跳入类@ControllerAdvice



我有一个这样的控制器:

@PostMapping
public ResponseEntity<RestResponse> test(@RequestBody @Valid RestRequest request) {
BodyRs BodyRs = service.setup(request.getBody());
return ResponseEntity.status(HttpStatus.OK).body(RestResponse.builder().body(BodyRs).build());
}
  • 当我使用 Request = '{}'(RestRequest 不为空(调用这个控制器时,它会跳到:

    public class RestExceptionHandler extends ResponseEntityExceptionHandler {
    @Autowired
    HolderService holderService;
    @Autowired
    LogService logService;
    @Override
    protected ResponseEntity<Object> handleNotValid(WebRequest request) {
    
    RestResponseHeader responseHeader = RestResponseHeader.builder()
    .respCode("10")
    .respDesc(fieldError.getField() + " " + fieldError.getDefaultMessage())
    .build();
    RestResponse restResponse = RestResponse.builder()
    .header(responseHeader)
    .build();
    holderService.setRestResponse(restResponse);
    logService.log("100");
    return ResponseEntity.ok().body(restResponse);
    }
    
  • 我如何模拟日志服务,因为当我在没有启动 MQ 的情况下运行单元测试时,它会在此行"logService.log("100"("处出错。

-我曾经在外面模拟它,但是当代码跳入RestExceptionHandler时,它不再是Mock对象了。

如果你在谈论RestExceptionHandler的单元测试,你可以注入模拟,或者(最好是在我看来(切换到使用构造函数自动连线,然后在构造函数中传递模拟更容易:

public class RestExceptionHandler extends ResponseEntityExceptionHandler {
private HolderService holderService;
private LogService logService;
@Autowired
public RestExceptionHandler(HolderService holderService, LogService logService) {
this.holderService = holderService;
this.logService = logService;
}
...
}

如果你在谈论控制器上的集成测试,你可以使用 Springboot 的MockBean注释来创建记录器服务的模拟 bean

最新更新