问题描述
我将一个自定义对象从 Cucumber Given
发布到 Rest Controller 中的端点。问题是,据我调查,自定义对象没有 BodyPublisher
,不建议实现。因此:
代码:
Map
实际上到达以下端点:
Given("^we have called the messages endpoint with a valid JSON message:$",(final DataTable dataTable) -> {
final var messageRawData = dataTable.asLists(String.class).stream()
.collect(toMap(row -> row.get(0),row -> row.get(1)));
final var faceString = messageRawData.keySet().toArray()[1].toString();
final var body = messageRawData.get(faceString).toString();
final var message = new Message(Face.valueOf(faceString),body);
final var messageBodyPublisher = HttpRequest.BodyPublishers.ofString(
new ObjectMapper().writeValueAsstring(messageRawData));
final var request = newBuilder(
create("http://localhost:" + applicationPort + "/message"))
.header("Content-Type",MediaType.APPLICATION_JSON_VALUE)
.POST(messageBodyPublisher).build();
assertthat(newHttpClient().send(request,ofString()).statusCode(),is(200));
});
}
其中 Message 只是以下 POJO:
@PostMapping(value = "/message",consumes = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Message> createMessage(@RequestBody final Message message) {
return ResponseEntity.ok(this.messageService.save(message));
}
解决方法
我已经使用库 RestAssured 设法实现了它(使用自定义对象):
When("^we have called the messages endpoint with a valid JSON message:$",(final DataTable dataTable) -> {
final Message message = assembleMessageFromDataTable(dataTable);
response = with().body(message)
.when()
.header("Content-Type",MediaType.APPLICATION_JSON_VALUE)
.request("POST","http://localhost:" + applicationPort + "/message");
});
Maven 依赖:
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured</artifactId>
<version>4.4.0</version>
<scope>test</scope>
</dependency>