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
部分来定义主体的哪些部分应该是动态的。这都是偏好问题。
我们的项目中使用了两种书写合同的方式。 首先是将请求和响应都保存为 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
部分来定义主体的哪些部分应该是动态的。这都是偏好问题。