spring-boot - Spring Cloud Contract - 查询参数合约总是匹配同一个合约
问题描述
我正在研究spring cloud contract并且有一个用例,当缺少一些查询参数时,我希望响应为BAD_REQUEST,并且当所有强制查询参数都存在时,我希望响应为OK。为了实现这一点,我有不同的合同(groovy 文件)来满足每个这样的请求/响应。但是当我从消费者(带/不带查询参数)进行测试时,所有这些都只匹配 1 个合约,无论是否存在查询参数。
下面列出的合同,
两个查询参数都不存在
Contract.make {
description("Test to see if authorisation works")
request {
method 'GET'
urlPath("/check/validate")
headers {
contentType('application/json')
}
}
response {
status(400)
"body" "shouldReturnBadRequest400BothFieldsNotPresent"
headers {
contentType('application/json')
}
}
}
查询参数 B 不存在
Contract.make {
description("Test to see if authorisation works")
request {
method 'GET'
urlPath("/check/validate") {
queryParameters {
parameter 'a' : value(regex(nonBlank()))
}
}
headers {
contentType('application/json')
}
}
response {
status(400)
"body" "shouldReturnBadRequest400BNotPresent"
headers {
contentType('application/json')
}
}
}
查询参数存在且响应正常
Contract.make {
description("Test to see if authorisation works")
request {
method 'GET'
urlPath('/check/validate') {
queryParameters {
parameter 'a' : equalTo("AUTHORISED")
parameter 'b' : value(regex(nonBlank()))
}
}
headers {
contentType('application/json')
}
}
response {
status(200)
"body" "shouldReturn200OkValidRequest"
headers {
contentType('application/json')
}
}
}
问题:
我所有的测试用例都与第一个案例匹配两个查询参数都不存在,而不是与具体情况匹配。请让我知道我错过了什么。
有人可以指出满足上述要求的查询参数的 spring-cloud-contract 文档。找到了这个(http://cloud.spring.io/spring-cloud-contract/1.0.x/#_passing_optional_parameters),但我需要更多关于我的上述要求的信息。
解决方案
你们的合同正在相互延长。每一个都比另一个更具体。您必须使用priority()
方法来说出哪个比另一个更具体。例如,最少的具体应该具有最高值的优先级 - priority(100)
。最- priority(1)
。
两个查询参数都不存在
Contract.make {
priority(100)
description("Test to see if authorisation works")
request {
method 'GET'
urlPath("/check/validate")
headers {
contentType('application/json')
}
}
response {
status(400)
"body" "shouldReturnBadRequest400BothFieldsNotPresent"
headers {
contentType('application/json')
}
}
}
查询参数 B 不存在
Contract.make {
priority(50)
description("Test to see if authorisation works")
request {
method 'GET'
urlPath("/check/validate") {
queryParameters {
parameter 'a' : value(regex(nonBlank()))
}
}
headers {
contentType('application/json')
}
}
response {
status(400)
"body" "shouldReturnBadRequest400BNotPresent"
headers {
contentType('application/json')
}
}
}
查询参数存在且响应正常
Contract.make {
priority(10)
description("Test to see if authorisation works")
request {
method 'GET'
urlPath('/check/validate') {
queryParameters {
parameter 'a' : equalTo("AUTHORISED")
parameter 'b' : value(regex(nonBlank()))
}
}
headers {
contentType('application/json')
}
}
response {
status(200)
"body" "shouldReturn200OkValidRequest"
headers {
contentType('application/json')
}
}
}
推荐阅读
- python - python中的ModuleNotFoundError(spyder项目)
- scala - 是否有集合类型(尤其是列表、集合和映射)的链式处理的术语?
- c# - 实体类对象改变了它的值,虽然它没有改变
- c++ - PROC_THREAD_ATTRIBUTE_PARENT_PROCESS 不使用新父级的环境块
- angular - 在 Angular 中切换和关闭验证器的良好做法?
- mysql - 使用 DBeaver 导入文件
- qt - Redis加加设置在循环中很延迟
- deep-learning - 如何使用自定义数据集为人类创建关键点检测模型
- .net-core - 从 netcore3.1 控制台应用访问 Azure 认知服务时未授权
- python - 通过装饰器更改类中函数的签名