2013-03-12 20 views
17

Obecnie piszę niektóre testy jednostkowe dla projektu Spring MVC. Ponieważ zwróconym typem nośnika jest JSON, próbuję użyć jsonPath, aby sprawdzić, czy zwrócono prawidłowe wartości.SpringMVC/mockMVC/jsonpath porównaj listę ciągów znaków

Problem polega na sprawdzeniu, czy lista ciągów znaków zawiera prawidłowe (i tylko prawidłowe) wartości.

mój plan:

  1. Sprawdź, czy lista ma prawidłową długość
  2. dla każdego elementu, który ma być zwrócony, sprawdź, czy jest na liście

niestety, żaden z te rzeczy wydają się działać.

Tutaj jest odpowiednia część mojego kodu:

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

Tylko pierwsze dwa "oczekiwania" (Isok & isArray) pracują. Pozostałe (dotyczące długości i treści) mogę skręcać i obracać, ale chcę, nie dają mi żadnego pożytecznego wyniku.

Wszelkie sugestie?

Odpowiedz

42

1) Zamiast

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

spróbować

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

2) Zamiast

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

spróbować

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

Pamiętaj, że musisz dodać hamcrest-library.

+0

Dziękuję bardzo! To bardzo pomogło! –

+0

Jeśli to pomogło, możesz oznaczyć moją odpowiedź jako zaakceptowaną :) – chaldaean

+0

@chaldaean Jakiej biblioteki hamowej używasz? W tym, który mam, hamcrest-all-1.1, klasa org.hamcrest.Matchers nie zawiera metod hasSize i containsInAnyOrder. –

0

Oto co skończyło się przy użyciu:

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

i

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