Spring Cloud Contracts应该具体还是灵活?

问题描述

在我们的项目中使用了两种写作合同样式。 首先是将请求和响应都保存为json文件,并使用它们定义合同:

request {
    body(file("request.json"))
}
response {
    body(file("response.json"))
}

它会创建存根,除非您的请求完全像request.json那样填写,否则存根将不起作用,这使得难以为使用者编写带有存根的单元测试。但是,使用具体的值可能更适合测试集成。

第二种方法是尽可能使用正则表达式:

request {
    body([
        clientName: $(anynonblankString()),accountNumber: $(consumer(regex("[0-9]{20}")),producer("12345678901234567890")),amount: $(anyNumber())
    ])
}

以这种方式定义的存根会很灵活,但最终只能测试请求中字段的存在及其格式。

哪种方式写合同是正确的?

解决方法

这仅取决于您的喜好。如果使用第一个选项,则仍可以使用bodyMatchers部分,在其中可以使用xpath或jspath来定义主体的哪些部分应该是动态的。都是优先事项。