2013-03-12 11 views
17

Şu anda bir Spring MVC projesi için bazı birim testleri yazıyorum. Döndürülen ortam türü JSON olduğundan, doğru değerlerin döndürülüp döndürmediğini kontrol etmek için jsonPath kullanmayı denerim.SpringMVC/mockMVC/jsonpath dizeleri karşılaştırın

Sahip olduğum sorun, bir dize listesi doğru (ve yalnızca doğru) değerleri içerip içermediğini doğrulamaktır.

Planım oldu: Liste döndürülecek gerekiyordu her bir öğe için doğru uzunluğa

  • sahiptir

    1. kontrol ediniz, bu

    ne yazık ki listede olsun hiçbiri kontrol Bu şeyler işe yarıyor gibi görünüyor.

    İşte alakalı benim kod parçası: Sadece ilk iki "beklentileri"

    Collection<AuthorityRole> correctRoles = magicDataSource.getRoles(); 
    
    ResultActions actions = this.mockMvc.perform(get("/accounts/current/roles").accept(MediaType.APPLICATION_JSON)) 
    .andExpect(status().isOk()) // works 
    .andExpect(jsonPath("$.data.roles").isArray()) // works 
    .andExpect(jsonPath("$.data.roles.length").value(correctRoles.size())); // doesn't work 
    
    for (AuthorityRole role : correctRoles) // doesn't work 
        actions.andExpect(jsonPath("$.data.roles[?(@=='%s')]", role.toString()).exists()); 
    

    (Isok & isArray) çalışıyoruz. Diğerleri (uzunluk ve içerik için) istediğim zaman çevirebilirim ve döndürebilirim, bana yararlı bir sonuç vermiyorlar.

    Herhangi bir öneriniz var mı?

  • cevap

    42

    1) yerine

    .andExpect(jsonPath("$.data.roles.length").value(correctRoles.size())); 
    

    arasında deneyin yerine

    for (AuthorityRole role : correctRoles) // doesn't work 
        actions.andExpect(jsonPath("$.data.roles[?(@=='%s')]", role.toString()).exists()); 
    

    arasında)

    .andExpect((jsonPath("$.data.roles", Matchers.hasSize(size)))); 
    

    2 deneyin

    actions.andExpect((jsonPath("$.data.roles", Matchers.containsInAnyOrder("role1", "role2", "role3")))); 
    

    Hamcrest-kütüphanesini eklemeniz gerektiğini unutmayın.

    +0

    çok teşekkür ederiz! Bu çok yardımcı oldu! –

    +0

    Eğer yardımcı olduysa, cevabımı kabul edilir olarak işaretleyebilirsiniz :) – chaldaean

    +0

    @chaldaean Hangi hamcrest kütüphanesini kullanıyorsunuz? Sahip olduğum birimde, hamcrest-all-1.1, org.hamcrest.Matchers sınıfı, hasSize ve includesInAnyOrder yöntemlerini içermiyor. –

    0

    İşte kullanıyorum sona erdi budur:

    .andExpect(jsonPath('$.data.roles').value(Matchers.hasSize(size)))

    ve

    .andExpect(jsonPath('$.data.roles').value(Matchers.containsInAnyOrder("role1", "role2", "role3")))