Java 在Hibernate/Spring Boot中具有字段集合的Spring DTO的单元测试
我正在使用Hibernate和JPA以及Spring Boot 我有一个DTO,它将从联系人处收集信息,预计来自客户端的表单,可能会发送多个电话:Java 在Hibernate/Spring Boot中具有字段集合的Spring DTO的单元测试,java,spring,hibernate,spring-mvc,Java,Spring,Hibernate,Spring Mvc,我正在使用Hibernate和JPA以及Spring Boot 我有一个DTO,它将从联系人处收集信息,预计来自客户端的表单,可能会发送多个电话: public class ContactDTO { private BigInteger userId; private String contactName; private Map<String, BigInteger> phones; // getters and setters } 我想我的问题有两个
public class ContactDTO {
private BigInteger userId;
private String contactName;
private Map<String, BigInteger> phones;
// getters and setters
}
我想我的问题有两个:
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class AdditiveControllerShould {
@Autowired
private AdditiveController additiveController;
@Autowired
private MockMvc mockMvc;
@Test
public void saveAnEntryWhenPOSTOnlyUserIdAndContactName() throws Exception {
mockMvc.perform(post("/newContact")
.param("userId", "12345")
.param("contactName", "John Smith"))
// how to run test for the Map<String, BigInteger> ???
.andExpect(status().isOk())
.andExpect(content().string(containsString("savedContact")));
}
}
@RunWith(SpringRunner.class)
@春靴测试
@AutoConfigureMockMvc
公共类AdditiveController应{
@自动连线
专用AdditiveController AdditiveController;
@自动连线
私有MockMvc-MockMvc;
@试验
public void saveAnentryWhenPostOnlyUserAndContactName()引发异常{
mockMvc.perform(post(“/newContact”)
.param(“用户ID”、“12345”)
.param(“联系人姓名”、“约翰·史密斯”))
//如何为地图运行测试???
.andExpect(状态().isOk())
.andExpect(content().string(containsString(“savedContact”));
}
}
控制器:
@PostMapping(value= "/newContact")
public String createNewContact(@RequestBody ContactDTO newContact) {
if (newContact.getPhones() !=null) {
// method that persists phone data
}
// .. use a CRUDRepository object to persist the data to MySQL DB
return "savedContact";
}
测试类:
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class AdditiveControllerShould {
@Autowired
private MockMvc mockMvc;
private static final ObjectMapper mapper=new ObjectMapper();
@Test
public void saveAnEntryWhenPOSTOnlyUserIdAndContactName() throws Exception {
Map<String,String> phones=new HashMap<>();
phones.put("phone1", "12345");
Map<String,Object> input=new HashMap<>();
input.put("userId", "123456");
input.put("contactName", "TEST");
input.put("phones", phones);
mockMvc.perform(post("/newContact")
.content(mapper.writeValueAsString(input))
.contentType(MediaType.APPLICATION_JSON_UTF8_VALUE))
.andExpect(status().isOk());
}
}
控制器:
@PostMapping(value= "/newContact")
public String createNewContact(@RequestBody ContactDTO newContact) {
if (newContact.getPhones() !=null) {
// method that persists phone data
}
// .. use a CRUDRepository object to persist the data to MySQL DB
return "savedContact";
}
测试类:
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class AdditiveControllerShould {
@Autowired
private MockMvc mockMvc;
private static final ObjectMapper mapper=new ObjectMapper();
@Test
public void saveAnEntryWhenPOSTOnlyUserIdAndContactName() throws Exception {
Map<String,String> phones=new HashMap<>();
phones.put("phone1", "12345");
Map<String,Object> input=new HashMap<>();
input.put("userId", "123456");
input.put("contactName", "TEST");
input.put("phones", phones);
mockMvc.perform(post("/newContact")
.content(mapper.writeValueAsString(input))
.contentType(MediaType.APPLICATION_JSON_UTF8_VALUE))
.andExpect(status().isOk());
}
}
我认为这很接近,但它给了我一个错误:
org.springframework.web.util.NestedServletException:请求处理失败;嵌套异常为javax.validation.ConstraintViolationException:在组[javax.validation.groups.Default]的持续时间内,类[app.models.relationentities.Contact]的验证失败,约束冲突列表:[ConstraintViolationImpl]{interpolatedMessage='may not null',propertyPath=name,rootBeanClass=class app.models.relationentities.Contact,messageTemplate='{javax.validation.constraints.NotNull.message}}
我想可能是变量名称的问题,所以我将input.put(“contactName”,“TEST”);
改为input.put(“name”,“TEST”);
但它仍然给我同样的错误。验证似乎有问题。请确保您正在将contactDTO实例获取,并且从那里您可以使用它。我能够在控制器内获取实例。如果我取出这些实例,则获取:input.put(“userId”,“123456”);input.put(“contactName”,“TEST”)
并将.param(“name”、“TEST”)
放在mockMvc.perform(post(“/newContact”)之后
,测试似乎通过了。我认为这很接近,但它给了我一个错误:org.springframework.web.util.NestedServletException:请求处理失败;嵌套异常是javax.validation.ConstraintViolationException:在组的持久时间内类[app.models.relationentities.Contact]的验证失败[javax.validation.groups.Default,]约束冲突列表:[ConstraintViolationImpl{interpolatedMessage='may not null',propertyPath=name,rootBeanClass=class app.models.relationentities.Contact,messageTemplate='{javax.validation.constraints.NotNull.message}}
我认为这可能是变量名称的问题,所以我将input.put(“contactName”,“TEST”);
更改为input.put(“name”,“TEST”);
但它仍然给我同样的错误。验证似乎有问题。请确保您正在将contactDTO实例获取,并且从那里您可以使用它。我能够在控制器内获取实例。如果我取出这些实例,则获取:input.put(“userId”,“123456”);input.put(“contactName”,“TEST”)在mockMvc.perform(post(“/newContact”)
之后放置.param(“name”,“TEST”)
,测试似乎通过了。