Spring boot Spring Cloud Contract-查询参数Contract始终与同一个Contract匹配

Spring boot Spring Cloud Contract-查询参数Contract始终与同一个Contract匹配,spring-boot,groovy,spring-boot-test,wiremock,spring-cloud-contract,Spring Boot,Groovy,Spring Boot Test,Wiremock,Spring Cloud Contract,我正在处理SpringCloudContract,有一个用例,我希望在缺少几个查询参数时响应为BAD_请求,在所有必需的查询参数都存在时响应为OK。为了实现这一点,我有不同的合同(groovy文件)来满足每一个这样的请求/响应。但是,当我从消费者(带/不带查询参数)进行测试时,无论查询参数是否存在,所有这些都只与1个契约匹配 以下列出的合同 两个查询参数都不存在 Contract.make { description("Test to see if authorisation works

我正在处理SpringCloudContract,有一个用例,我希望在缺少几个查询参数时响应为BAD_请求,在所有必需的查询参数都存在时响应为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')
        }
    }
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')
    }
}
}

查询参数B不存在

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

问题:

  • 我所有的测试用例都与第一个匹配两个查询参数都不存在,而不是与具体情况匹配。请让我知道我错过了什么

  • 有人能指出SpringCloud合同文档中关于满足上述要求的查询参数吗。找到此()但我需要有关上述要求的更多信息


  • 你们的合同正在互相延长。每一个都比另一个更具体。您必须使用
    priority()
    方法来说明哪一个更具体。例如,最小的混凝土应具有最高的值优先级-
    优先级(100)
    。最高优先级(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')
            }
        }
    }
    
    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')
        }
    }
    }
    
    查询参数B不存在

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

    +1感谢您的超级快速回复Marcin。我已经探索了这个使用优先级的选项,但希望确保它是为我的用例推荐的实现方式