2013-03-12 20 views
17

Attualmente sto scrivendo alcuni test unitari per un progetto Spring MVC. Poiché il tipo di supporto restituito è JSON, provo a utilizzare jsonPath per verificare se vengono restituiti i valori corretti.SpringMVC/mockMVC/jsonpath confronta l'elenco di stringhe

Il problema che si verifica è verificare se un elenco di stringhe contiene i valori corretti (e solo quelli corretti).

Il mio piano era:

  1. Verificare che la lista ha la giusta lunghezza
  2. Per ogni elemento che dovrebbe essere restituito, controllare se è nella lista

purtroppo, nessuno di queste cose sembrano funzionare.

Ecco la parte rilevante del mio codice:

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

Solo i primi due "aspettative" (Isok & IsArray) stanno lavorando. Gli altri (per lunghezza e contenuto) posso girare e girare come voglio, non mi danno alcun risultato utile.

Qualche suggerimento?

risposta

42

1) Invece di

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

provare

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

2) Invece di

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

provare

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

Ricorda che devi aggiungere hamcrest-library.

+0

Grazie mille! Questo ha aiutato molto! –

+0

Se è stato utile, puoi contrassegnare la mia risposta come accettata :) – chaldaean

+0

@chaldaean Quale libreria hamcrest stai usando? In quello che ho, hamcrest-all-1.1, la classe org.hamcrest.Matchers non contiene i metodi hasSize e contieneInAnyOrder. –

0

Ecco quello che ho finito per usare:

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

e

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