【问题标题】:Java Wiremock random string test failureJava Wiremock 随机字符串测试失败
【发布时间】:2019-01-04 10:01:22
【问题描述】:

我正在生成一些我正在使用 Wiremock 进行测试的 JSON。但是,我现在需要向 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"))));
}

【问题讨论】:

  • randomNumber 使用您的代码生成?你能模拟它,生成伪随机字符串吗?

标签: java json wiremock


【解决方案1】:

我不相信有任何“开箱即用”的方式来断言请求正文中的通配符。我过去曾遇到过类似的问题,并且过去曾使用过运行良好的条件查询。

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\"}");

【讨论】:

    猜你喜欢
    • 2020-03-13
    • 2016-01-31
    • 2021-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多