我正在生成一些JSON,我正在使用Wiremock进行测试。但是,我现在需要向JSON添加一个随机生成的字符串,每次运行测试时,该字符串显然都会改变。这导致断言失败。有人对我如何解决这个问题有任何想法吗?
Json:
"data": {
"case": {
"user": {
"name": {
"title": "Mr",
"firstName": "John",
"lastName": "Smith"
},
"address": { }
}
},
"subscriptions": {
"userSubscription": {
"randomNumber": "{{I am a random string so fail}}",
"email": null,
"mobile": null
},
"supporterSubscription" : null
}
}
测试:
@Test
public void should_handle_callback()
throws Exception {
submitStub();
HttpEntity<String> request = new HttpEntity<>("string");
// fails
ResponseEntity<CallbackResponse> result =
this.restTemplate.postForEntity(baseUrl, request, CallbackResponse.class);
}
private static String loadJson(String fileName) throws IOException {
URL url = getResource(fileName);
return Resources.toString(url, Charsets.toCharset("UTF-8"));
}
private void submitStub() throws Exception {
ccdServer.stubFor(post(concat(SUBMIT_EVENT_URL))
.withHeader(AUTHORIZATION, equalTo(USER_AUTH_TOKEN))
.withHeader(SERVICE_AUTHORIZATION_HEADER_KEY, equalTo(SERVICE_AUTH_TOKEN))
.withHeader(CONTENT_TYPE, equalTo(MediaType.APPLICATION_JSON_UTF8_VALUE))
.withRequestBody(equalToJson(createCaseRequest))
.willReturn(aResponse()
.withHeader(CONTENT_TYPE, APPLICATION_JSON_VALUE)
.withStatus(200)
.withBody(loadJson("testjson.json"))));
}
答案 0 :(得分:0)
我不认为有任何“开箱即用”的方法可以对请求正文中的通配符进行断言。过去我遇到过类似的问题,并且过去使用过标准查询,效果很好。
http://wiremock.org/docs/verifying/
请查看该页面的“条件查询”部分,其中显示了如何直接查询请求日志的示例。
代码应类似于以下内容:
List<LoggedRequest> requests = findAll(postRequestedFor(urlMatching("/api/.*")));
在获得此请求列表之后,您可以遍历结果以查找LoggedRequest主体之一是否包含您要查找的json。
一个用于检查JSON是否与通配符匹配的好库是JSON-Unit,它使您可以填充使用“ $ {json-unit.ignore}”自动生成的字段。
https://github.com/lukas-krecan/JsonUnit
您的断言可能看起来像这样:
assertThatJson(requests.get(0).getBodyAsString())
.isEqualTo("{\"id\":\"${json-unit.ignore}\",\"name\":\"bob\"}");