Skip to content

MockServer verify with multiple body matchers

I’m using MockServer body matchers to verify an endpoint request’s body parameters. Some properties can be matched exactly, but others may need a separate subString or regex matcher, because part of that property is unknown. For example, a date-time string may have a known date, but unknown time.

However, with multiple withBody() calls, the verify method passes if one or more matcher passes. How to implement a logical AND instead of an OR?

mockServer.verify(
    request()
        .withPath(url)
        .withMethod("POST")
        .withBody(
            json(
                "{"firstName": "foo","lastName": "bar"}",
                MatchType.ONLY_MATCHING_FIELDS))
        .withBody(
            // Need subString because we don't know the time and only want to validate the date
            subString(""order_date_time": "2021-04-15")));

Answer

To perform a logical-AND on multiple body matcher criteria, you need to call the verify() method multiple times:

private void verifyOrderPlaced() {
  verifyName();
  verifyOrderDate();
}

private void verifyName() {
  mockServer.verify(
      request()
          .withPath(url)
          .withMethod("POST")
          .withBody(
              json(
                  "{"firstName": "foo","lastName": "bar"}",
                  MatchType.ONLY_MATCHING_FIELDS)));
}

private void verifyOrderDate() {
  mockServer.verify(
      request()
          .withPath(url)
          .withMethod("POST")
          .withBody(
              subString(""order_date_time": "2021-04-15")));
}