如何在MockMvc junit测试中将@RestController的ResponseBody作为对象?

mem*_*und 5 java junit spring spring-mvc spring-test

我有一个简单的junit测试,用于验证servlet端点的响应.

问题:我想以java对象的形式 获取响应Person,而不是作为string/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?
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 6

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

String json = rt.getResponse().getContentAsString();
Person person = new ObjectMapper().readValue(json, Person.class);
Run Code Online (Sandbox Code Playgroud)

你也可以@Autowire ObjectMapper