带有spring-restdocs 2.0.2.RELEASE的Nullpointer(带有Restassured)

时间:2018-08-03 12:33:20

标签: java spring spring-boot rest-assured spring-restdocs

我使用spring-boot-dependencies(2.0.4.RELEASE)中的spring-restdocs和spring-restdocs-restassured(2.0.2.RELEASE)。

我使用的代码如下:

  @BeforeAll
  static void setup(RestDocumentationContextProvider restDocumentation) throws IOException {
    spec = new RequestSpecBuilder()
        .addFilter(
            documentationConfiguration(restDocumentation)
                .operationPreprocessors()
                .withRequestDefaults(prettyPrint())
                .withResponseDefaults(prettyPrint()))
        .build();

    descriptor = new FieldDescriptor[] {
            fieldWithPath("prop1").description("Is property 1"),
            fieldWithPath("prop2").description("Is property 2"),
            fieldWithPath("prop3").description("Is property 3"),
            fieldWithPath("prop4").description("Is property 4"),
            fieldWithPath("prop5").description("Is property 5")};
  }

  @Test
  void should_not_be_nullpointer(){
    given(spec)
        .filter(document("demo",
            responseFields().andWithPrefix("[].", descriptor)
        ))
        .port(port)
        .basePath("v1")
    .when()
        .get("/demo")
    .then()
        .contentType(JSON)
        .statusCode(200);
  }

我收到以下错误:

java.lang.NullPointerException
    at org.springframework.restdocs.ManualRestDocumentation.beforeOperation(ManualRestDocumentation.java:89)
    at org.springframework.restdocs.RestDocumentationExtension.lambda$resolveParameter$0(RestDocumentationExtension.java:58)
    at org.springframework.restdocs.restassured3.RestAssuredRestDocumentationConfigurer.filter(RestAssuredRestDocumentationConfigurer.java:69)
    at org.springframework.restdocs.restassured3.RestAssuredOperationPreprocessorsConfigurer.filter(RestAssuredOperationPreprocessorsConfigurer.java:46)
    at io.restassured.filter.Filter$filter.call(Unknown Source)

将spring-restdocs依赖性设置为2.0.1.RELEASE版本时,它会按预期工作。

这似乎是一个错误(我打开了一个问题here),但是如果有人对此有更多的了解,将非常欢迎。

1 个答案:

答案 0 :(得分:2)

Spring REST Docs中的上下文是方法范围的,但是您使用@BeforeAll使其成为类范围的。由于RestDocumentationExtension处于有状态状态,因此您以前可以避免这种配置错误。 JUnit Jupiter扩展应该是无状态的,因此RestDocumentationExtension处于有状态是一个错误。 REST Docs 2.0.2已修复该问题,这就是为什么配置错误会导致问题的原因。

您可以通过将@BeforeAll替换为@BeforeEach(并从static方法中删除setup)来解决此问题。有关使用JUnit 5时正确设置内容的更多详细信息,请参见REST文档reference documentation