Unit testing 用MockMvc-post方法测试Spring控制器

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

我正在尝试在Spring引导应用程序中测试控制器的一种方法。这是一个post端点,它在请求中获取一个id,并将该id传递给服务:

@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();