Я создаю интеграционное тестирование с использованием весеннего облачного контракта. Все работает нормально, от настройки до добавления заглушек в проект. Поэтому я обнаружил, что запрос не совпадает, несмотря на то, что все параметры и заголовки совпадают.
{
"url" : "/my-project/api/checkTransaction/id?id=ASDFGHJKL",
"absoluteUrl" : "http://127.0.0.1:8085/my-project/api/checkTransaction/id?id=ASDFGHJKL",
"method" : "GET",
"clientIp" : "127.0.0.1",
"headers" : {
"Accept" : "application/json",
"X-B3-ParentSpanId" : "6f922af45db72e2e",
"User-Agent" : "Java/1.8.0_111",
"Connection" : "keep-alive",
"Host" : "127.0.0.1:8085",
"X-Span-Name" : "http://my-project/api/checkTransaction/id",
"X-B3-SpanId" : "886d8cfcdeec47ca",
"X-B3-Sampled" : "0",
"X-B3-TraceId" : "6f922af45db72e2e",
"requestKey" : "RANDOM",
"defaultId" : "12345",
"baggage-requestKey" : "RANDOM",
"baggage-defaultId" : "12345",
"Content-Type" : "application/json",
"username" : "589e329c-1cf1-4eb5-b7bb-eaffdd266560"
},
"cookies" : { },
"browserProxyRequest" : false,
"loggedDate" : 1526541502499,
"bodyAsBase64" : "",
"body" : "",
"loggedDateString" : "2018-05-17T07:18:22Z",
"queryParams" : {
"id" : {
"key" : "id",
"values" : [ "ASDFGHJKL" ]
}
}
}
Closest match:
{
"urlPath" : "/api/checkTransaction/id",
"method" : "GET",
"headers" : {
"defaultId" : {
"equalTo" : "12345"
},
"username" : {
"matches" : "[\\p{L}]*"
},
"requestKey" : {
"equalTo" : "RANDOM"
},
"Content-Type" : {
"matches" : "application/json.*"
},
"Accept" : {
"matches" : "application/json.*"
}
},
"queryParameters" : {
"id" : {
"equalTo" : "ASDFGHJKL"
}
}
}
Вот тест для API
@Test
public void checkId_Contract() throws Exception {
// given:
MockMvcRequestSpecification request = given()
.header("requestKey", "RANDOM")
.header("accept-language", "en")
.header("accept-encoding", "gzip")
.header("Content-Type", "application/json;charset=UTF-8");
// when:
ResponseOptions response = given().spec(request)
.queryParam("id","ASDFGHJKL")
.when().async()
.timeout(10000)
.get("/api/id/ASDFGHJKL/check");
// then:
assertThat(response.statusCode()).isEqualTo(200);
assertThat(response.header("Content-Type")).matches("application/json;charset=UTF-8.*");
// and:
DocumentContext parsedJson = JsonPath.parse(response.getBody().asString());
assertThatJson(parsedJson).field("['errors']").isNull();
assertThatJson(parsedJson).field("['message']").isEqualTo("Id not found");
assertThatJson(parsedJson).field("['value']").isNull();
assertThatJson(parsedJson).field("['code']").isEqualTo("ID_NOT_FOUND");
}
Вот контракт, который вызывается API
Contract.make {
request {
method 'GET'
url('/api/checkTransaction/id') {
headers {
header 'defaultId' : '12345'
header 'username' : $(anyAlphaUnicode())
header 'requestKey' : 'RANDOM'
contentType('application/json')
accept('application/json')
}
queryParameters {
parameter 'id' : 'ASDFGHJKL'
}
}
}
response {
status 200
async()
fixedDelayMilliseconds(5000)
headers{
contentType('application/json')
}
body '''\
{
"code": "ID_NOT_FOUND",
"message": "ID not found",
"errors": null,
"value": null,
"success": false
}
'''
}
}
даже когда я удаляю имя пользователя из запроса контракта, все равно получаю ту же ошибку.
Нужно ли создавать заголовки для X-B3-ParentSpanId и т. Д., Чтобы он совпадал?