【问题标题】:How to mock a service when validate request body and jump into class have @ControllerAdvice验证请求正文并跳转到类时如何模拟服务有@ControllerAdvice
【发布时间】:2020-05-22 03:12:08
【问题描述】:

我有一个这样的控制器:

@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 not blank) 调用这个控制器时,它会跳转到:

    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);
    }
    
  • 如何模拟 LogService,因为当我在不启动 MQ 的情况下运行单元测试时,会在“logService.log("100")”这一行出错。

-我曾经在外面Mock过,但是当代码跳转到RestExceptionHandler时,它不再是一个Mock对象了。

【问题讨论】:

    标签: java spring unit-testing


    【解决方案1】:

    如果您正在谈论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 注解来创建你的 logger 服务的模拟 bean

    【讨论】:

    • 谢谢,我使用 MockBean 然后修复了问题。
    猜你喜欢
    • 2018-12-12
    • 2018-06-10
    • 1970-01-01
    • 2020-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多