代码之家  ›  专栏  ›  技术社区  ›  ThanksForAllTheFish

从spring restdocs生成的spring契约:忽略头

  •  0
  • ThanksForAllTheFish  · 技术社区  · 6 年前

    我评论过 this issue 我被要求开一张新的罚单,但后来意识到这更像是一个问题,因为spring restdocs提供了一种实现我想要的(忽略合同中不重要的头)的方法 operation preprocessor .所以我们到了,在我们友好的特种部队

    问题是我试图从 RestDocs 测试(使用 RestAssured junit5 如果重要的话)。测试设置(在kotlin中)如下所示:

    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 (我想)我根本不在乎那个头球。然而, 日期 头导致存根生成失败,正如我决定使用 Spring Cloud Contracts in a polyglot world approach 生成存根并上传到maven存储库,因为现在服务器生成不同的日期。

    正如我指出的 here ,和 ContractDslSnippet 似乎无法忽略不重要的标题和/或添加匹配项(这仍然是一个悬而未决的问题)。

    问题(简短)列表:

    • 如何从生成的合同中筛选出不重要的标题?
    • 我可以像对body那样为header添加自定义匹配器吗?
    1 回复  |  直到 6 年前
        1
  •  0
  •   ThanksForAllTheFish    6 年前

    如何删除不重要的标题,使用 Spring RestDocs preprocessors 以下内容:

    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() :我认为现在不可能,但这里可能错了(如果有人能插话纠正我,我很高兴)