2017-03-10 1 views
4
MvcResult result = this.mockMvc.perform(
       MockMvcRequestBuilders.get(mockUrl)) 
       .andExpect(MockMvcResultMatchers.status().isOk()) 
      .andExpect(MockMvcResultMatchers.content().contentType("application/ json;charset=UTF-8")) 
       .andDo(MockMvcResultHandlers.print()) 

Donne-moi ce qui suit:Comment utiliser MockMvcResultMatchers.jsonPath

MockHttpServletResponse: 
      Status = 200 
    Error message = null 
      Headers = {Content-Type=[application/json;charset=UTF-8]} 
    Content type = application/json;charset=UTF-8 
      Body = {"version":"0.1"} 
    Forwarded URL = null 
    Redirected URL = null 
      Cookies = [] 

Cependant, les tests avec

MvcResult result = this.mockMvc.perform(
       MockMvcRequestBuilders.get(mockUrl)) 
       .andExpect(MockMvcResultMatchers.status().isOk()) 
      .andExpect(MockMvcResultMatchers.content().contentType("application/ json;charset=UTF-8")) 
       .andExpect(jsonPath("$.version").value("0.1")) 

renvoie l'erreur suivante:

java.lang.AssertionError: No value at JSON path "$.version", exception: net/minidev/json/writer/JsonReaderI 

at org.springframework.test.util.JsonPathExpectationsHelper.evaluateJsonPath(JsonPathExpectationsHelper.java:245) 
at org.springframework.test.util.JsonPathExpectationsHelper.assertValue(JsonPathExpectationsHelper.java:99) 
at org.springframework.test.web.servlet.result.JsonPathResultMatchers$2.match(JsonPathResultMatchers.java:99) 
at org.springframework.test.web.servlet.MockMvc$1.andExpect(MockMvc.java:171) 
at com.vmware.skyscraper.rts.runbooks.RunbookControllerTest.testGetSingleRunbook(RunbookControllerTest.java:93) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:498) 
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) 
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75) 
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86) 
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84) 
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:252) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191) 
at org.junit.runner.JUnitCore.run(JUnitCore.java:137) 
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68) 
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:51) 
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:237) 
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:498) 
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) 

Comment faire J'utilise jsonPath?

+1

Pouvez-vous afficher le reste de l'exception? De toute façon, on dirait que vous avez des espaces supplémentaires dans 'application/json' – sm4

+0

Ajout du reste de l'exception. Les espaces supplémentaires étaient une faute de frappe dans Stackoverflow. Désolé pour ça. –

+0

Avez-vous trouvé la réponse à votre problème? – sm4

Répondre

2
+0

Pas de chance. Obtenir la même erreur. –

0

Votre code fonctionne pour moi très bien. J'utilise Jackson pour analyser les cas et c'est probablement la seule différence. Vérifiez mon code:

classe Résultat:

public class Res { 
    String version; 

    public String getVersion() { 
     return version; 
    } 

    public void setVersion(String version) { 
     this.version = version; 
    } 
} 

Controller:

@RequestMapping(value = "/blah", 
     method = GET, 
     produces = APPLICATION_JSON_VALUE) 
public HttpEntity<Res> doIt() { 
    Res res = new Res(); 
    res.setVersion("0.1"); 
    return new HttpEntity<>(res); 
} 

Test:

@Test 
public void blahTest() throws Exception { 
    this.mockMvc.perform(
      MockMvcRequestBuilders.get("/blah")) 
      .andExpect(MockMvcResultMatchers.status().isOk()) 
      .andExpect(MockMvcResultMatchers.content().contentType("application/json;charset=UTF-8")) 
      .andExpect(jsonPath("$.version").value("0.1")) 
      .andDo(MockMvcResultHandlers.print()); 
} 

Réponse:

MockHttpServletResponse: 
      Status = 200 
    Error message = null 
      Headers = {Content-Type=[application/json;charset=UTF-8]} 
    Content type = application/json;charset=UTF-8 
      Body = {"version":"0.1"} 
    Forwarded URL = null 
    Redirected URL = null 
      Cookies = [] 

Je ne peux que recommander de changer la librairie JSON que vous utilisez. Sinon, essayez de mettre à jour votre code avec toutes les parties nécessaires pour créer un exemple simple, minimal et reproductible de votre problème.

+0

Merci. Pouvez-vous s'il vous plaît me dire comment vous utilisez Jackson. Ma compréhension était que l'objet Res était implicitement converti en Json. Comment pouvons-nous explicitement convertir en JSON en utilisant Jackson? –

+0

J'utilise spring boot, jackson est la bibliothèque standard qui fournit la conversion. Il est automatiquement ajouté par spring-boot-starter-web je pense. – sm4