我有一个这样的控制器:
@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