W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
最好的情況是提供固定值,但是有時您需要在響應(yīng)中引用一個請求。
如果您使用Groovy DSL編寫合同,則可以使用fromRequest()
方法,該方法使您可以從HTTP請求中引用一堆元素。您可以使用以下選項:
fromRequest().url()
:返回請求URL和查詢參數(shù)。fromRequest().query(String key)
:返回具有給定名稱的第一個查詢參數(shù)。fromRequest().query(String key, int index)
:返回具有給定名稱的第n個查詢參數(shù)。fromRequest().path()
:返回完整路徑。fromRequest().path(int index)
:返回第n個路徑元素。fromRequest().header(String key)
:返回具有給定名稱的第一個標頭。fromRequest().header(String key, int index)
:返回具有給定名稱的第n個標題。fromRequest().body()
:返回完整的請求正文。fromRequest().body(String jsonPath)
:從請求中返回與JSON路徑匹配的元素。如果您使用的是YAML合同定義,則必須使用帶有自定義Spring Cloud Contract函數(shù)的
Handlebars {{{ }}}
符號來實現(xiàn)此目的。
{{{ request.url }}}
:返回請求URL和查詢參數(shù)。{{{ request.query.key.[index] }}}
:返回具有給定名稱的第n個查詢參數(shù)。例如,鍵foo
的第一個條目{{{ request.query.foo.[0] }}}
{{{ request.path }}}
:返回完整路徑。{{{ request.path.[index] }}}
:返回第n個路徑元素。例如,首次輸入`
{{{request.path。[0] }}}{{{ request.headers.key }}}
:返回具有給定名稱的第一個標頭。{{{ request.headers.key.[index] }}}
:返回具有給定名稱的第n個標頭。{{{ request.body }}}
:返回完整的請求正文。{{{ jsonpath this 'your.json.path' }}}
:從請求中返回與JSON路徑匹配的元素。例如json路徑$.foo
-{{{ jsonpath this '$.foo' }}}
考慮以下合同:
YAML。
request: method: GET url: /api/v1/xxxx queryParameters: foo: - bar - bar2 headers: Authorization: - secret - secret2 body: foo: bar baz: 5 response: status: 200 headers: Authorization: "foo {{{ request.headers.Authorization.0 }}} bar" body: url: "{{{ request.url }}}" path: "{{{ request.path }}}" pathIndex: "{{{ request.path.1 }}}" param: "{{{ request.query.foo }}}" paramIndex: "{{{ request.query.foo.1 }}}" authorization: "{{{ request.headers.Authorization.0 }}}" authorization2: "{{{ request.headers.Authorization.1 }}" fullBody: "{{{ request.body }}}" responseFoo: "{{{ jsonpath this '$.foo' }}}" responseBaz: "{{{ jsonpath this '$.baz' }}}" responseBaz2: "Bla bla {{{ jsonpath this '$.foo' }}} bla bla"
運行JUnit測試生成將導(dǎo)致類似于以下示例的測試:
// given: MockMvcRequestSpecification request = given() .header("Authorization", "secret") .header("Authorization", "secret2") .body("{\"foo\":\"bar\",\"baz\":5}"); // when: ResponseOptions response = given().spec(request) .queryParam("foo","bar") .queryParam("foo","bar2") .get("/api/v1/xxxx"); // then: assertThat(response.statusCode()).isEqualTo(200); assertThat(response.header("Authorization")).isEqualTo("foo secret bar"); // and: DocumentContext parsedJson = JsonPath.parse(response.getBody().asString()); assertThatJson(parsedJson).field("['fullBody']").isEqualTo("{\"foo\":\"bar\",\"baz\":5}"); assertThatJson(parsedJson).field("['authorization']").isEqualTo("secret"); assertThatJson(parsedJson).field("['authorization2']").isEqualTo("secret2"); assertThatJson(parsedJson).field("['path']").isEqualTo("/api/v1/xxxx"); assertThatJson(parsedJson).field("['param']").isEqualTo("bar"); assertThatJson(parsedJson).field("['paramIndex']").isEqualTo("bar2"); assertThatJson(parsedJson).field("['pathIndex']").isEqualTo("v1"); assertThatJson(parsedJson).field("['responseBaz']").isEqualTo(5); assertThatJson(parsedJson).field("['responseFoo']").isEqualTo("bar"); assertThatJson(parsedJson).field("['url']").isEqualTo("/api/v1/xxxx?foo=bar&foo=bar2"); assertThatJson(parsedJson).field("['responseBaz2']").isEqualTo("Bla bla bar bla bla");
如您所見,響應(yīng)中已正確引用了請求中的元素。
生成的WireMock存根應(yīng)類似于以下示例:
{ "request" : { "urlPath" : "/api/v1/xxxx", "method" : "POST", "headers" : { "Authorization" : { "equalTo" : "secret2" } }, "queryParameters" : { "foo" : { "equalTo" : "bar2" } }, "bodyPatterns" : [ { "matchesJsonPath" : "$[?(@.['baz'] == 5)]" }, { "matchesJsonPath" : "$[?(@.['foo'] == 'bar')]" } ] }, "response" : { "status" : 200, "body" : "{\"authorization\":\"{{{request.headers.Authorization.[0]}}}\",\"path\":\"{{{request.path}}}\",\"responseBaz\":{{{jsonpath this '$.baz'}}} ,\"param\":\"{{{request.query.foo.[0]}}}\",\"pathIndex\":\"{{{request.path.[1]}}}\",\"responseBaz2\":\"Bla bla {{{jsonpath this '$.foo'}}} bla bla\",\"responseFoo\":\"{{{jsonpath this '$.foo'}}}\",\"authorization2\":\"{{{request.headers.Authorization.[1]}}}\",\"fullBody\":\"{{{escapejsonbody}}}\",\"url\":\"{{{request.url}}}\",\"paramIndex\":\"{{{request.query.foo.[1]}}}\"}", "headers" : { "Authorization" : "{{{request.headers.Authorization.[0]}}};foo" }, "transformers" : [ "response-template" ] } }
發(fā)送請求(例如合同的request
部分中提出的請求)會導(dǎo)致發(fā)送以下響應(yīng)正文:
{ "url" : "/api/v1/xxxx?foo=bar&foo=bar2", "path" : "/api/v1/xxxx", "pathIndex" : "v1", "param" : "bar", "paramIndex" : "bar2", "authorization" : "secret", "authorization2" : "secret2", "fullBody" : "{\"foo\":\"bar\",\"baz\":5}", "responseFoo" : "bar", "responseBaz" : 5, "responseBaz2" : "Bla bla bar bla bla" }
此功能僅適用于版本大于或等于2.5.1的WireMock。Spring Cloud Contract驗證程序使用WireMock的response-template
響應(yīng)轉(zhuǎn)換器。它使用把手將“ Mustache{{{ }}}
”模板轉(zhuǎn)換為適當?shù)闹?。此外,它注冊了兩個幫助程序功能:
escapejsonbody
:以可以嵌入JSON的格式轉(zhuǎn)義請求正文。jsonpath
:對于給定的參數(shù),在請求正文中找到一個對象。Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: