Unit testing 用MockMvc-post方法测试Spring控制器
我正在尝试在Spring引导应用程序中测试控制器的一种方法。这是一个post端点,它在请求中获取一个id,并将该id传递给服务:Unit testing 用MockMvc-post方法测试Spring控制器,unit-testing,spring-mvc,spring-boot,mockito,mockmvc,Unit Testing,Spring Mvc,Spring Boot,Mockito,Mockmvc,我正在尝试在Spring引导应用程序中测试控制器的一种方法。这是一个post端点,它在请求中获取一个id,并将该id传递给服务: @Slf4j @Controller public class AdministrationController { private final AdministrationService administrationService; @Autowired public AdministrationController(Administra
@Slf4j
@Controller
public class AdministrationController {
private final AdministrationService administrationService;
@Autowired
public AdministrationController(AdministrationService administrationService) {
this.administrationService = administrationService;
}
@PostMapping("/administration")
public @ResponseBody ResponseEntity<String> deleteByMessageId(String id) {
return new ResponseEntity<>(administrationService.deleteMessageById(id), HttpStatus.OK);
}
}
}
运行此测试时,将执行post请求,但正文为空:
MockHttpServletRequest:
HTTP Method = POST
Request URI = /administration
Parameters = {}
Headers = {Content-Type=[application/json]}
Body = <no character encoding set>
Session Attrs = {}
我错过了什么?如何使用MockMvc设置请求正文?您肯定缺少方法参数的注释
public @ResponseBody ResponseEntity<String> deleteByMessageId(String id)
public@ResponseBody ResponseEntity deleteByMessageId(字符串id)
应该是这样的:
public @ResponseBody ResponseEntity<String> deleteByMessageId(@RequestParam("id") String id)
public@ResponseBody ResponseEntity deleteByMessageId(@RequestParam(“id”)字符串id)
如果要将其用作请求参数
请看下面的图片。
当然,编写测试取决于您对此处id的期望 尝试使用
.characterEncoding(“utf-8”)
:
另一个选项(受@stelios anastasakis answer启发)是在内容类型
标题中提供字符编码:
MvcResult result = mvc.perform(post("/administration")
.contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)
.content(json)
.andExpect(status().isOk())
.andReturn();
请注意,我们在这里使用
MediaType.APPLICATION\u JSON\u UTF8\u VALUE
而不是MediaType.APPLICATION\u JSON
。顺序必须是characterEncoding、content、contenttype,您确定吗?我想马特里似乎不记得那个顺序对我的IDE很重要。我还没查过。但这个命令行得通,我想我知道李·米多尔是从哪里来的。顺序无关紧要。问题是代码中有一个额外的括号,或者缺少一个。andExpect()在您关闭mvc.perform()之后出现。andExpect()未链接到post()。我刚才碰巧遇到了这个问题。你能把这个问题标记为已回答吗?感谢应用程序\u JSON\u UTF8\u值
已被弃用
public @ResponseBody ResponseEntity<String> deleteByMessageId(@RequestParam("id") String id)
MvcResult result = mvc.perform(post("/administration")
.contentType(MediaType.APPLICATION_JSON)
.content(json)
.characterEncoding("utf-8"))
.andExpect(status().isOk())
.andReturn();
MvcResult result = mvc.perform(post("/administration")
.contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)
.content(json)
.andExpect(status().isOk())
.andReturn();