Spring Contracts, сгенерированные из Spring RestDocs: игнорирование заголовков - PullRequest
0 голосов
/ 30 октября 2018

TL; DR: я прокомментировал эту проблему и получил запрос открыть новый тикет, но потом понял, что это скорее вопрос, так как Spring RestDocs предоставляет способ достичь того, что я хочу (игнорируя неважно заголовки в контрактах) с операционным препроцессором . Итак, мы здесь, на нашей дружной SoF

Проблема в том, что я пытаюсь создать контракты, начиная с RestDocs теста (используя RestAssured и junit5, если это имеет значение). Тестовая настройка (в Котлине) выглядит так:

private val defaultDocument = document("{method_name}", SpringCloudContractRestDocs.dslContract())
lateinit var spec: RequestSpecification
@BeforeEach
internal fun setUp(restDocumentationContextProvider: RestDocumentationContextProvider) {
    RestAssured.port = port
    spec = RequestSpecBuilder()
        .setConfig(
            RestAssuredConfig.config()
                .objectMapperConfig(
                    ObjectMapperConfig.objectMapperConfig()
                        .jackson2ObjectMapperFactory { _, _ -> mapper }
                )
        )
        .addFilter(defaultDocument)
        .addFilter(ResponseLoggingFilter())
        .log(LogDetail.ALL)
        .build()
}

, где mapper и port вводятся в виде Spring бобов.

Сервер генерирует заголовок Date, который является временем, когда генерируется ответ. Это делается автоматически Spring WebMvc (я думаю), и мне наплевать на этот заголовок. Однако заголовок Date приводит к сбою создания заглушки, так как я решил использовать Spring Cloud Contracts в мире полиглотов для создания и загрузки заглушки в репозиторий maven, потому что теперь сервер генерирует другую дату.

Как я отмечаю здесь , ContractDslSnippet , по-видимому, не обеспечивает способ игнорировать неважные заголовки и / или добавлять сопоставления (что по-прежнему остается открытым вопросом).

(краткий) список вопросов:

  • Как отфильтровать неважные заголовки из сгенерированных контрактов?
  • Могу ли я добавить собственные соответствия для заголовков, как я могу сделать для тела?

1 Ответ

0 голосов
/ 30 октября 2018

Как удалить неважный заголовок, используя Препроцессоры Spring RestDocs :

private val defaultDocument = document("{method_name}", SpringCloudContractRestDocs.dslContract())
lateinit var spec: RequestSpecification
@BeforeEach
internal fun setUp(restDocumentationContextProvider: RestDocumentationContextProvider) {
    RestAssured.port = port
    spec = RequestSpecBuilder()
        .setConfig(
            RestAssuredConfig.config()
                .objectMapperConfig(
                    ObjectMapperConfig.objectMapperConfig()
                        .jackson2ObjectMapperFactory { _, _ -> mapper }
                )
        )
        .addFilter(
            documentationConfiguration(restDocumentationContextProvider)
                .operationPreprocessors()
                .withResponseDefaults(Preprocessors.removeMatchingHeaders("Date"))
        )
        .addFilter(defaultDocument)
        .addFilter(ResponseLoggingFilter())
        .log(LogDetail.ALL)
        .build()
}

Важной частью является добавление нового фильтра (первого), который заботится о настройке Spring RestDocs для удаления Date из всех его фрагментов, включая контрактные.

Как добавить пользовательские сопоставления, используя значение по умолчанию SpringCloudContractRestDocs.dslContract(): я не думаю, что это на самом деле возможно сейчас, но здесь может быть неправильно (рад, если кто-то может ввести и исправить меня в случае)

...