Нулевой указатель с spring-restdocs 2.0.2.RELEASE (с восстановлением)

Я использую spring-restdocs и spring-restdocs-restassured (2.0.2.RELEASE) из зависимостей spring-boot (2.0.4.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, все работает должным образом.

Похоже, это ошибка (я открыл вопрос здесь), но если у кого-то есть больше информации об этом, это будет очень кстати.


person 1lln3ss    schedule 03.08.2018    source источник


Ответы (1)


Контекст в Spring REST Docs ограничен методом, но ваше использование @BeforeAll делает его ограниченным классом. Ранее вам сошла с рук эта неправильная конфигурация из-за того, что RestDocumentationExtension сохранял состояние. Расширения JUnit Jupiter должны быть без состояния, поэтому RestDocumentationExtension состояние с сохранением состояния было ошибкой. Это было исправлено в REST Docs 2.0.2, поэтому неправильная конфигурация теперь вызывает проблему.

Вы можете решить эту проблему, заменив @BeforeAll на @BeforeEach (а также удалив static из метода setup). См. документы REST справочная документация для получения более подробной информации о правильной настройке при использовании JUnit 5.

person Andy Wilkinson    schedule 06.08.2018