2017-10-10 32 views
1

我使用Hibernate和JPA与Spring Boot。春季DTO的单元测试,在Hibernate/Spring Boot中有一个字段集合

我有一个DTO这会从联系人,其中,设想来从客户端的一种形式,将可能有多个手机发送信息收集:

public class ContactDTO { 

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

    // getters and setters 
} 

我想象的数据将在一个JSON对象被发送的格式如下:

{phones:[{"mobile":"2325552932"}, {"landline":"2235553329"}, ...]

我有一个POST方法设计为处理控制器:

@PostMapping(path = "/newContact") 
    public String createNewContact(@ModelAttribute ContactDTO newContact) { 
    if (newContact.getPhones() !=null) { 
     // method that persists phone data 
    } 
    // .. use a CRUDRepository object to persist the data to MySQL DB 
    return "savedContact"; 
    } 

我想我的问题是双重的:

  1. 将我的控制器能够自动映射该格式的JSON对象?
  2. 我该如何测试?

我使用了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"))); 
    } 
} 

回答

3

控制器

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

     } 

} 

输出:

CONTACT ContactDTO [userId=123456, contactName=TEST, phones={phone1=12345}] 
+0

我认为这是接近,但它给我一个错误:'org.springframework.web.util.NestedServletException:请求处理失败;嵌套异常为javax.validation.ConstraintViolationException:对于组[javax.validation.groups.Default,]在持续时间期间类[app.models.relationentities.Contact]的验证失败约束违规列表:[ \t ConstraintViolationImpl {interpolatedMessage = '可能不为空',propertyPath = name,rootBeanClass = class app.models.relationentities.Contact,messageTemplate ='{javax.validation.constraints.NotNull.message}'}' – NateH06

+0

我想也许这是一个名称问题的变量,所以我改变了'input.put(“contactName”,“TEST”);'input.put(“name”,“TEST”);'但它仍然给我相同的错误 – NateH06

+0

它看起来像验证问题。确保你获得contactDTO实例,并从那里你可以把它打开。我能够获得控制器内的实例。 – Barath