Java 在Hibernate/Spring Boot中具有字段集合的Spring 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 } 我想我的问题有两个

我正在使用Hibernate和JPA以及Spring Boot

我有一个DTO,它将从联系人处收集信息,预计来自客户端的表单,可能会发送多个电话:

public class ContactDTO {

   private BigInteger userId;
   private String contactName;
   private Map<String, BigInteger> phones;

   // getters and setters
}
我想我的问题有两个:

  • 我的控制器是否能够以这种格式自动映射JSON对象
  • 我该如何测试它
  • 我正在使用Spring启动测试,它们看起来像这样:

    @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”)
    ,测试似乎通过了。