介绍
我有一个关于restcontroller和测试的问题。
我有以下内容
PostMapping
:
@PostMapping(path = "/download/as/zip/{zipFileName}" )
@ResponseBody
public ResponseEntity<InputStreamResource> downloadDocumentZip(@RequestHeader(required=false,name="X-Application") String appName, @RequestBody ZipFileModel zipFileModel, @PathVariable("zipFileName") String zipFileName)
我有以下测试:
Response response = given(this.requestSpecification).port(port)
.filter(document("downloadAsZip",
preprocessRequest(prettyPrint()),
requestHeaders(headerWithName("X-Application").description("Owner application")),
pathParameters(parameterWithName("zipFileName").description("The name of the resulting zip file. Mostly not needed/optional.")))
)
.contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)
.header(new Header(HEADER, "themis"))
.body(jsonContent)
.when()
.post("/download/as/zip/{zipFileName}", "resultFile.zip");
这项工作和200被退回。
第一个问题
现在我对
.contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)
在测试中。
Content-Type是返回响应的头。但在这个测试中,它是在提出测试请求时包含的?
或者在这种情况下,它是否表示我们正在请求主体中发送JSON?
第二个问题
我知道我的控制器方法应该使用JSON,并返回字节。
因此,我做了以下更改:
@Postmapping(path=“/download/as/zip/zipFileName”,使用=
MediaType.APPLICATION_JSON_VALUE)
到目前为止,这是可行的。
因此,我添加了以下内容:
@PostMapping(path = "/download/as/zip/{zipFileName}", consumes = MediaType.APPLICATION_JSON_VALUE,
produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
失败了:
java.lang.AssertionError:
Expected :200
Actual :406
<Click to see difference>
所以我把测试改为:
.contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)
.accept(MediaType.APPLICATION_OCTET_STREAM_VALUE)
这又一次失败了。
Expected :200
Actual :406
因此,即使客户机发出的信号与控制器产生的接收头相同,我们也有一个错误。
问题:
-
所以我们应该还是不应该
produces=
在请求映射上?
-
为什么现在失败了?在使用JSON和生成字节时是否存在冲突?或
ContentType
在测试中?