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

时间:2017-11-09 14:35:22

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

我有一个简单的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?
    }
}

3 个答案:

答案 0 :(得分:6)

你可以这样反序列化:

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

你也可以@Autowire ObjectMapper

答案 1 :(得分:1)

由于我的目标主要是测试整个设置,意味着通过spring自动配置的objectmapper和restcontroller,我只是为端点创建了一个模拟器。并且输入参数作为响应返回,因此我可以验证它:

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

答案 2 :(得分:0)

如果您不受TestRestTemplate::getForEntity

的限制,可以使用mockMvc