@rstoyanchev 让我先澄清一下实现细节,让一切都清楚。
我有一个控制器,它消耗BatchRequest
(稍后详细说明)HttpServletRequest
和HttpServletResponse
实例:
@PostMapping(path = "${cleverdata.dmpkit.spring.web.batch.endpoint:/batch}")
public BatchResponse batch(
@RequestBody
BatchRequest batchRequest, HttpServletRequest servletRequest,
HttpServletResponse servletResponse) throws Exception {
return batchRequestService.process(batchRequest, servletRequest, servletResponse);
}
BatchRequest
- 是一个由子请求组成的 pojo,正如我之前所悲伤的那样,这些子请求是具有以下字段的自给自足的请求:
HttpHeaders headers
byte[] body
String httpMethod
String url
该实现迭代子请求对象,使每个子请求对象适应接口HttpServletRequest
并调用该DispatcherServlet.service(HttpServletRequest, HttpServletResponse)
方法。之后,根据HttpServletResponse
传递给方法的相应对象构建子响应对象 DispatcherServlet.service()
。所有子响应对象都聚合到 BatchResponse pojo 中并返回给客户端。简化版本如下所示:
public BatchResponse process(
BatchRequest request, HttpServletRequest servletRequest,
HttpServletResponse servletResponse) {
BatchResponseBuilder batchResponseBuilder = BatchResponse.builder();
for (BatchRequest.Part requestPart : parts) {
BatchHttpServletRequest requestWrapper = new BatchHttpServletRequest(
servletRequest, requestPart
);
BatchHttpServletResponse responseWrapper = new BatchHttpServletResponse(servletResponse);
servlet.service(requestWrapper, responseWrapper);
BatchResponse.Part responsePart = BatchResponse.Part.builder()
.status(HttpStatus.valueOf(responseWrapper.getStatus()))
.body(responseWrapper.getContent())
.headers(responseWrapper.getHeaderObject())
.build();
batchResponseBuilder.part(responsePart);
}
return batchResponseBuilder.build();
}
BatchRequest
和对象使用符合rfc2046 的BatchResponse
自定义消息转换器进行序列化/反序列化。
因此,从MockMvc
角度来看,没有任何变化,它的工作方式与以前相同,仅保留一个 MvcResult
根据预期进行评估的实例。
如果我们有机会将一个TestDispatcherSevlet
实例注册为 spring bean,那就太棒了,我相信我的用例并不那么具体,只是利用 spring 抽象的常见方法(DispatcherServlet
)
谢谢。