2017-10-10 25 views
1

私はHibernateとSpringBootでJPAを使用しています。Hibernate/Springブートでフィールドのコレクションを持つSpring DTOのユニットテスト

public class ContactDTO { 

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

    // getters and setters 
} 

私が想像しています:

私は、潜在的に複数の電話機が送信されている可能性が考え、クライアント側からのフォームから来ると想定されている連絡先からの情報を収集することになるDTOを持っています

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

そして、私はそれを処理するために設計されたPOSTメソッドを持つコントローラがあります:データはこの形式でJSONオブジェクトに送信されます

  1. 私のコントローラは自動的にその形式でJSONオブジェクトをマッピングすることができるようになります:
    @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"; 
        } 
    

    私は私の質問は2つありと思いますか?

  2. どうすればテストできますか?

私は春のブートテストを使用しています、そして、彼らはこのような何かを見て:

@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:要求の処理に失敗しました。グループの持続時間中にクラス[app.models.relationentities.Contact]の検証が失敗しました[javax.validation.groups.Default、] 制約違反のリスト:[ \t ConstraintViolationImpl {interpolatedMessage = 'nullではない可能性があります'、propertyPath = name、rootBeanClass =クラスapp.models.relationentities.Contact、messageTemplate = '{javax.validation.constraints.NotNull.message}'} – NateH06

+0

私は 'input.put(" contactName "、" TEST ");'を 'input.put(" name "、" TEST ");に変更しましたが、それでも私には同じエラーが与えられます – NateH06

+0

検証の問題あなたがcontactDTOインスタンスを取得していることを確認し、そこから取得することができます。私はコントローラ内でインスタンスを取得することができました。 – Barath

関連する問題