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

returns the following:

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 = []

However, testing it with

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"))

returns the following error:

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)

How do I use jsonPath?

Pradeep Vairamani
  • 4,004
  • 3
  • 36
  • 59

3 Answers3

21

Your code works for me just fine. I am using Jackson to parse the cases and that's probably the only difference. Check my code:

Result class:

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

Response:

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 = []

I can only recommend trying to change the Json parser library you are using. Otherwise, try to update your code with all the parts that are needed to create a simple, minimal and reproducible example of your problem.

MartinTeeVarga
  • 10,478
  • 12
  • 61
  • 98
  • Thank you. Can you please tell me how you are using Jackson. My understanding was that Res object was implicitly getting converted to Json. How can we explicitly convert to json using Jackson? – Pradeep Vairamani Mar 14 '17 at 18:25
  • I use spring boot, jackson is the standard library that provides the conversion. It is automatically added by spring-boot-starter-web I think. – MartinTeeVarga Mar 15 '17 at 09:04
2

All credit for this answer goes to @pramodh (Hidden in OP's comments)

I had the exact same problem and installing his reccomended dependencies fixed everything.

<dependency>
    <groupId>net.minidev</groupId>
    <artifactId>json-smart</artifactId>
    <version>2.3</version>
    <scope>test</scope>
</dependency> 
<dependency> 
    <groupId>net.minidev</groupId>
    <artifactId>asm</artifactId>
    <version>1.0.2</version>
    <scope>test</scope>
</dependency>
coltonfranco
  • 147
  • 2
  • 15