首页 > 解决方案 > 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')
        }
    }

}

问题:

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

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

标签: spring-bootgroovyspring-boot-testwiremockspring-cloud-contract

解决方案


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

推荐阅读