TL; DR:我在this issue上发表了评论,并被要求打开一张新票,但是后来意识到这更多的是问题,因为Spring RestDocs提供了一种实现我想要的方式的方法(忽略合同中不重要的标头) )和operation preprocessor。因此,我们就在友好的SoF上
问题是我试图从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
Bean注入。
服务器生成一个Date
头,这是生成响应的时间。 Spring WebMvc
是自动完成的(我认为),我根本不关心该标头。但是,Date
头会导致存根生成失败,因为我决定使用Spring Cloud Contracts in a polyglot world approach来生成存根并将其上载到maven存储库,因为现在服务器生成了另一个日期。
正如我指出的here,ContractDslSnippet似乎没有提供一种忽略不重要的标头和/或添加匹配器的方法(这仍然是一个悬而未决的问题)。
(简短的)问题列表:
答案 0 :(得分:0)
如何使用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()
添加自定义匹配器:我现在暂时还无法实现,但是这里可能是错误的(如果有人可以鸣叫并以防万一,我很高兴)>