2017-10-10 6 views
1

J'utilise Hibernate et le JPA avec Spring Boot.Test d'unité pour Spring DTO qui a une collection pour un champ en Hibernate/Spring Boot

J'ai un DTO qui collecterait des informations provenant d'un contact, qui est envisagé de venir d'une forme du côté client qui aurait pu éventuellement avoir plusieurs téléphones envoyé:

public class ContactDTO { 

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

    // getters and setters 
} 

J'imagine la les données seront envoyées dans un objet JSON dans ce format:

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

Et j'ai un contrôleur avec une méthode POST conçu pour gérer que:

@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"; 
    } 

Je suppose que mes questions sont de deux ordres:

  1. sera mon contrôleur pouvoir cartographier automatiquement l'objet JSON dans ce format?
  2. Comment pourrais-je tester cela?

J'utilise le test de démarrage du printemps, et ils regardent quelque chose comme ceci:

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

Répondre

3

Controller:

@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"; 
    } 

Classe d'essai:

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

     } 

} 

sortie:

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

Je pense que ce proche, mais il me donne une erreur: 'org.springframework.web.util.NestedServletException: traitement Échec de la demande; l'exception imbriquée est javax.validation.ConstraintViolationException: la validation a échoué pour les classes [app.models.relationentities.Contact] pendant la durée de persistance des groupes [javax.validation.groups.Default,] Liste des violations de contraintes: [ \t ConstraintViolationImpl {interpolatedMessage = 'ne peut pas être nul', propertyPath = name, rootBeanClass = classe app.models.relationentities.Contact, messageTemplate = '{javax.validation.constraints.NotNull.message}'} ' – NateH06

+0

Je pensais que c'était peut-être un problème avec un nom de la variable, donc j'ai changé 'input.put (" contactName "," TEST ");' à 'input.put (" nom "," TEST ");' mais ça me donne toujours la même erreur – NateH06

+0

On dirait problème avec la validation. assurez-vous que vous obtenez l'instance de contactDTO et à partir de là, vous pouvez le prendre. J'ai été en mesure d'obtenir l'instance à l'intérieur du contrôleur. – Barath