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