2017-02-15 40 views
0

我对Spring Rest Docs的Get方法有一个测试用例。它运行良好。随着代码的发布方法,以下以同样的方式:Spring Rest Docs错误 - “由于输入结束而没有内容映射”

Foo foo = new Foo(...); 
    this.mockMvc.perform(post("/foos") 
      .contentType(APPLICATION_JSON_UTF8) 
      .content(objectMapper.writeValueAsString(foo))) 
      .andExpect(status().isCreated()) 
      .andExpect(header().string("Location", notNullValue())) 
      .andDo(document("foo-post", preprocessResponse(prettyPrint()), 
        links(
          halLinks(), 
          linkWithRel("self").description("..."), 
          linkWithRel("foo").description("...")), 
        responseFields(
          fieldWithPath("attr1").description("..."), 
          fieldWithPath("attr2").description("..."), 
          ... 
          fieldWithPath("_links").description("<<resource-book-links,links>> to other resources") 
        ) 
      )); 

我得到一个错误,但是。

org.springframework.restdocs.snippet.ModelCreationException: com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input at [Source: [[email protected]; line: 1, column: 0] 
at org.springframework.restdocs.hypermedia.LinksSnippet.createModel(LinksSnippet.java:131) 
at org.springframework.restdocs.snippet.TemplatedSnippet.document(TemplatedSnippet.java:64) 
at org.springframework.restdocs.generate.RestDocumentationGenerator.handle(RestDocumentationGenerator.java:196) 
at org.springframework.restdocs.mockmvc.RestDocumentationResultHandler.handle(RestDocumentationResultHandler.java:55) 
at org.springframework.test.web.servlet.MockMvc$1.andDo(MockMvc.java:177) 
at com.example.SpringDataSampleApplicationTests.createBookRest(SpringDataSampleApplicationTests.java:173) 
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:483) 
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.restdocs.JUnitRestDocumentation$1.evaluate(JUnitRestDocumentation.java:55) 
at org.junit.rules.RunRules.evaluate(RunRules.java:20) 
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:483) 
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) 
Caused by: com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input at [Source: [[email protected]; line: 1, column: 0] 
at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:270) 
at com.fasterxml.jackson.databind.ObjectMapper._initForReading(ObjectMapper.java:3838) 
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3783) 
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2929) 
at org.springframework.restdocs.hypermedia.AbstractJsonLinkExtractor.extractLinks(AbstractJsonLinkExtractor.java:41) 
at org.springframework.restdocs.hypermedia.LinksSnippet.createModel(LinksSnippet.java:127) 
... 41 more 

如果我在“andDo(..)”之后注释掉任何内容,那很好。这意味着问题出现在文档部分。

缺什么?

+0

它看起来像回应没有身体。什么是异常的完整堆栈跟踪? –

+0

嗨,安迪,我在问题中添加了完整的堆栈跟踪。如果我在responseFields部分发表评论,那么错误也会发生。此外,Post方法与Post相同的数据与Get相同。 – vic

+0

这是由于空响应主体而失败的链接片段。鉴于您正在使用Location标头测试201 Created的响应,对我来说空洞的主体似乎很可能。你确定它不是空的吗? –

回答

2

使用MockMvc进行的测试未在POST请求中设置Accept标头。这意味着,默认情况下,Spring Data REST在201 Created响应中不包含主体。您需要configure Spring Data REST to always return a body for create requests或者您需要更改测试以发送Accept标题。

+0

设置与Postman的设置不同吗?在Postman的手动测试中,我只需要在标题中设置内容类型。另外,我看看你的测试代码https://github.com/spring-projects/spring-restdocs/blob/master/samples/rest-notes-spring-hateoas/src/test/java/com/example/笔记/ ApiDocumentation.java,我没有看到标题设置中的任何区别。 – vic

+0

那些测试使用Spring HATEOAS,而不是Spring Data REST。他们也没有记录201回应的正文,因为没有回应。为什么不尝试我所建议的? –

+0

有趣!在我用HAL JSON添加接受之后,它确实有效。 – vic

相关问题