Spring 云合同应该具体还是灵活?

Should Spring Cloud Contracts be concrete or flexible?

我们的项目中使用了两种书写合同的方式。 首先是将请求和响应都保存为 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())
    ])
}

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

怎样写合同才是正确的?

这只取决于你喜欢什么。如果您使用第一个选项,您仍然可以在可以使用 xpath 或 jspath 的地方使用 bodyMatchers 部分来定义主体的哪些部分应该是动态的。这都是偏好问题。