Spring 云合同 - 查询参数合同始终与同一合同匹配

Spring Cloud Contract - Query Parameter contracts always matches to the same contract

我正在研究 spring 云合同,并且有一个用例,我希望在缺少一些查询参数时响应为 BAD_REQUEST 并且在所有必需查询参数都为 OK 时响应为 OK当下。为了实现这一点,我有不同的合同(groovy 文件)来满足每个这样的 request/responses。但是,当我从消费者(with/without 查询参数)进行测试时,无论是否存在查询参数,所有这些都只匹配一份合同。

下面列出的合同,

两个查询参数都不存在

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')
        }
    }

}

问题:

  1. 我的所有测试用例都与第一个用例匹配两个查询参数都不存在而不是与特定匹配。请让我知道我缺少什么。

  2. 有人可以指出满足上述要求的查询参数的 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')
        }
    }
}