1 回答
TA贡献1834条经验 获得超8个赞
从您的控制器返回 201:正如您的断言测试期望201使用created状态一样,但您的控制器返回 200(OK)。
@PostMapping("/items")
public ResponseEntity<?> addItem(@RequestBody Item item) {
Item savedItem = itemBusinessService.addAnItem(item);
return new ResponseEntity<>(savedItem, HttpStatus.CREATED);
}
或者修改您的测试以检查状态 OK(200)。如果您不想断言“位置”,请更新您的测试。
@Test
public void createItem() throws Exception {
RequestBuilder request = MockMvcRequestBuilders
.post("/items")
.accept(MediaType.APPLICATION_JSON)
.content("{\"id\":1,\"name\":\"Book\",\"price\":10,\"quantity\":100}")
.contentType(MediaType.APPLICATION_JSON);
MvcResult result = mockMvc.perform(request)
.andExpect(status().isOk()).andReturn();
}
更新--允许位置标头作为响应
如果您希望“位置”从标题返回,请修改您的控制器和下面的测试用例以在标题中检查位置。
第 1 步:在您的控制器的 add item 方法中,添加位置 uri 并返回。
@PostMapping("/items")
public ResponseEntity<?> addItem(@RequestBody Item item) {
Item savedItem = businessService.addAnItem(item);
HttpHeaders httpHeaders = new HttpHeaders();
UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.newInstance();
UriComponents uriComponents =
uriComponentsBuilder.path("/item/").buildAndExpand("/item/");
httpHeaders.setLocation(uriComponents.toUri());
return new ResponseEntity<>(savedItem, httpHeaders, HttpStatus.CREATED);
}
第 2 步:现在您的测试将"location"按照您的预期进行断言。
@Test
public void createItem() throws Exception {
RequestBuilder request = MockMvcRequestBuilders
.post("/items")
.accept(MediaType.APPLICATION_JSON)
.content("{\"id\":1,\"name\":\"Book\",\"price\":10,\"quantity\":100}")
.contentType(MediaType.APPLICATION_JSON);
MvcResult result = mockMvc.perform(request)
.andExpect(status().isCreated())
.andExpect(header().string("location", containsString("/item/")))
.andReturn();
}
添加回答
举报