【问题标题】:How to test the @RequestBody of a @RestController with junit?如何用junit测试@RestController的@RequestBody?
【发布时间】:2018-04-21 08:57:23
【问题描述】:

我想为我的@RestController 之一编写一个简单的测试,并断言输入@RequestBody 已正确映射到PersonDTO

@RestController
public class PersonServlet {
    @PostMapping("/person") 
    public PersonRsp find(@RequestBody PersonDTO dto) {
        //business logic
    }
}

public class PersonDTO {
    private String firstname, lastname;
}

问题:如何向该 servlet 发送 JSON 请求正文。还要检查所有已正确设置的PersonDTO 字段?

可能与此类似,但我不知道如何检查/窥探已解析的 DTO?

@RunWith(SpringRunner.class)
@WebMvcTest(PersonSerlvet.class)
public class PersonTests {
    @Autowired
    private MockMvc mvc;

    @Test
    public void testExample() throws Exception {
        this.mvc.perform(get("/person"))
                .andExpect(status().isOk());
    }
}

@Duplicate 标记:这不是链接问题的副本(关于如何读取响应正文字符串)。我实际上是在要求请求正文测试。

【问题讨论】:

  • ¿使用记录器?
  • 我不认为验证记录器输出是一个好的单元测试断言!
  • 事实上,您不是要求进行单元测试,而是要进行集成测试,如果您想在测试中测试输入并且不修改它以用于生产,您可以使用模拟 appender 或方法拦截器。
  • 不,我要求测试单个方法,只是将请求(输入)解析到由 spring 基于输入构造的 DTO(@RequestBody)。
  • 为什么叫控制器PersonServlet?它与 @RestController 注释相矛盾。这是一个很好的示例 HelloControllerIT,解释了如何测试 Spring Boot 控制器。 spring.io/guides/gs/spring-boot 。为了测试输入参数,您可以使用 Test Spy xunitpatterns.com/Test%20Spy.html

标签: java spring spring-mvc junit spring-test


【解决方案1】:

测试 Json 到 DTO 的反序列化实际上并不是您的 Controller 的责任,您将测试底层对象映射器,它是一个外部库(Jackson、Gson ..??)

不确定正在使用哪个库,但如果您想测试它的使用情况,您需要以与应用程序框架类似的方式手动构建适当的对象映射器,并使用其 api 从 Json 字符串序列化到目标 DTO

【讨论】:

  • 好的,我明白了,但我更喜欢测试在 spring 上下文中创建的对象映射器,而不是不同的对象映射器(即仅在测试期间自己创建)。
  • 是的,可以理解,你能在测试的上下文中直接自动装配它吗@Autowired private ObjectMapper objectMapper; ?
猜你喜欢
  • 2023-03-10
  • 2017-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-06
  • 1970-01-01
  • 2021-08-22
相关资源
最近更新 更多