【问题标题】:How to get ResponseBody of @RestController as object in a MockMvc junit test?如何在 MockMvc junit 测试中获取 @RestController 的 ResponseBody 作为对象?
【发布时间】:2017-11-09 14:35:22
【问题描述】:

我有一个简单的 junit 测试来验证 servlet 端点的响应。

问题:我想以 java 对象 Person 的形式获取响应,而不是作为字符串/json/xml 表示形式。

这可能吗?

@RestController
public class PersonController {
    @GetMapping("/person")
    public PersonRsp getPerson(int id) {
        //...
        return rsp;
    }   
}

@RunWith(SpringRunner.class)
@WebMvcTest(value = PersonController.class)
public class PersonControllerTest {
    @Autowired
    private MockMvc mvc;

    @Test
    public void test() {
        MvcResult rt = mvc.perform(get("/person")
                .param("id", "123")
                .andExpect(status().isOk())
                .andReturn();

        //TODO how to cast the result to (Person) p?
    }
}

【问题讨论】:

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


    【解决方案1】:

    你可以像这样反序列化它:

    String json = rt.getResponse().getContentAsString();
    Person person = new ObjectMapper().readValue(json, Person.class);
    

    你也可以@Autowire ObjectMapper

    【讨论】:

    • 另外可以直接用.andExpect(content().json("{'message':'ok'}"));等验证响应对象JSON
    • 我怎样才能@Autowire the ObjectMapper?能举个例子吗?
    • 您可以阅读有关自动装配herehere 希望对您有所帮助
    【解决方案2】:

    由于我的目标主要是测试整个设置,即通过 spring 自动配置的 objectmapper 和 restcontroller 集,我刚刚为端点创建了一个 mock。并返回输入参数作为响应,所以我可以验证它:

    @RestController
    public class PersonControllerMock {
        @GetMapping("/person")
        public PersonDTO getPerson(PersonDTO dto) {
            return dto;
        }   
    }
    
    
    @RunWith(SpringRunner.class)
    @WebMvcTest(value = PersonControllerMock.class)
    public class PersonControllerTest {
        @Autowired
        private MockMvc mvc;
    
        @Test
        public void test() {
            mvc.perform(get("/person")
                    .param("id", "123")
                    .param("firstname", "john")
                    .param("lastname", "doe")
                    .andExpect(status().isOk())
                    .andExpect(jsonPath("$.firstname").value("john"))
                    .andExpect(jsonPath("$.lastname").value("doe"))
                    .andReturn();
        }
    }
    

    【讨论】:

      【解决方案3】:

      如果不限制mockMvc,可以使用TestRestTemplate::getForEntity

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-03
        • 2016-11-30
        • 2018-04-21
        • 2023-03-10
        • 2021-01-06
        • 1970-01-01
        • 1970-01-01
        • 2021-05-02
        相关资源
        最近更新 更多