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

时间:2019-01-24 08:41:45

标签: spring-boot groovy spring-boot-test wiremock spring-cloud-contract

我正在研究Spring Cloud Contract,并且有一个用例,当缺少一些查询参数时,我希望响应为BAD_REQUEST,而当所有必需查询参数都存在时,我希望响应为OK。为了实现这一点,我有不同的合同(常规文件)来满足每个这样的请求/响应。但是,当我从使用者(带有/不带有查询参数)进行测试时,无论是否存在查询参数,所有这些都仅匹配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')
        }
    }

}

问题:

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

  2. 有人可以指向满足上述要求的有关查询参数的spring-cloud-contract文档。找到了这个http://cloud.spring.io/spring-cloud-contract/1.0.x/#_passing_optional_parameters,但是我需要上述要求的更多信息。

1 个答案:

答案 0 :(得分:0)

您的合同正在彼此延长。每个都比另一个更具体。您必须使用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')
        }
    }
}