2013-11-01 1 views
8

Ho un campo JSON che si chiama template.welcome.email e sto scrivendo un test unitario che controlla se quel campo è presente nella risposta dal server ma non riesco a trovare una via di fuga per i punti nel nome del campo. Il codice del mio test è:JsonPath JUnit carattere di escape per punti

@Test 
public void testEmailTemplates() throws Exception {  
    mockMvc.perform(get("/emailTemplates") 
     .contentType(MediaType.APPLICATION_JSON) 
     .locale(Locale.UK) 
     .accept(MediaType.APPLICATION_JSON)) 

     .andDo(print()) 
     .andExpect(status().isOk()) 

     .andExpect(jsonPath("$.template.welcome.email").exists()) 

     .andExpect(redirectedUrl(null)) 
     .andExpect(forwardedUrl(null)); 
} 

ma ottengo la seguente eccezione, perché i punti sono interpretate come percorsi:

java.lang.AssertionError: No value for JSON path: $.template.welcome.email, exception: invalid path 
at org.springframework.test.util.JsonPathExpectationsHelper.evaluateJsonPath(JsonPathExpectationsHelper.java:74) 
at org.springframework.test.util.JsonPathExpectationsHelper.exists(JsonPathExpectationsHelper.java:121) 
at org.springframework.test.web.servlet.result.JsonPathResultMatchers$3.match(JsonPathResultMatchers.java:77) 
at org.springframework.test.web.servlet.MockMvc$1.andExpect(MockMvc.java:141) 
at 

Sapete qualsiasi carattere di escape per la jsonPath?

risposta

4

Come Idapointed out:

Utilizzare staffe e le virgolette intorno alla vostra campo. Ad esempio, se il campo è valid.key.with.dot

riferimento ad esso come [ 'valid.key.with.dot'] e in JsonPath, provare

JsonPath.read(jsonString, "$.['valid.key.with.dot']")

+0

Ho avuto gli stessi pensieri, vediamo se qualcuno ha un'idea intelligente .. – daniele

+0

Ohhh, ecco perché il mio percorso (con una barra in avanti sfuggita) non funziona! – Tom

+0

Sì, è possibile, vedere la risposta di Ida –

32

Usa parentesi e virgolette intorno al tuo campo. Ad esempio, se il campo è valid.key.with.dot

riferiscono ad essa come ['valid.key.with.dot'] e in JsonPath, provare

JsonPath.read(jsonString, "$.['valid.key.with.dot']") 

Vedi questa discussione anche: https://groups.google.com/forum/#!topic/jsonpath/7YvgXWP1_7Y

+0

Anche questo funziona in altre librerie che usano internamente JsonPath (per esempio REST-assicurato). Grazie Ida! –

+0

Fatto questo anche nell'interfaccia utente SOAP: JSONPath Match. Funziona perfettamente! – iaforek

3

In questi giorni (ad esempio io.rest-assured.json-path:3.0.1) la notazione sembra essere senza staffe:

// Some Groovy OData V4 $count test 
// Response looks like: 
// { "@odata.count": 2, ... } 
body "'@odata.count'", equalTo(2) 

ho trovato il corr suggerimento di inclusione in this Git issue.