java - 编写与 Hamcrest AllOf/CombinableMatcher 匹配器配合良好的自定义匹配器

标签 java matcher hamcrest

我正在尝试组成两个匹配器,这样就不用写了

assertThat(response, hasStatusCode(OK));
assertThat(response, hasMessage("Some message."));

我可以写一些类似的东西

assertThat(response, 
    both(hasStatusCode(OK))
    .and(hasMessage("Some message.")));

但是,当一个或两个匹配器失败时运行断言时,我会得到不需要的奇怪输出:

Expected: (status code to be <200> and response to contain message "Some Message.")
 but: response to contain message "Some Message." response message was "Actual message"

似乎有什么东西干扰了不匹配的文本。我希望“但是”行读起来像 但是:(状态代码为<200>,响应消息为“实际消息”)

从逻辑上讲,匹配器似乎工作正常。

匹配器是:

private Matcher<Response> hasMessage(final String expectedMessage) {
  return new TypeSafeDiagnosingMatcher<Response>() {
    @Override
    protected boolean matchesSafely(final Response response, final Description mismatch) {
      String message = response.getEntity().toString();
      if (message != expectedMessage) {
        mismatch.appendText("response message was ").appendValue(message);
        return false;
      }
      return true;
    }

    @Override
    public void describeTo(final Description description) {
      description.appendText("response to contain message ").appendValue(expectedMessage);
    }

  };
}

private Matcher<Response> hasStatusCode(final Status expectedStatusCode) {
  return new TypeSafeDiagnosingMatcher<Response>() {
    @Override
    protected boolean matchesSafely(final Response response, final Description mismatch) {
      int statusCode = response.getStatus();
      if (expectedStatusCode.getStatusCode() != statusCode) {
        mismatch.appendText("status code was ").appendValue(statusCode);
      }
      return true;
    }

    @Override
    public void describeTo(final Description description) {
      description.appendText("status code to be ").appendValue(expectedStatusCode.getStatusCode());
    }
  };
}

最佳答案

这就是 AllOf 呈现不匹配的方式:它仅显示第一个失败的 Matcher,其中 its description followed by its description of the mismatch :

if (!matcher.matches(o)) {
    mismatch.appendDescriptionOf(matcher).appendText(" ");
    matcher.describeMismatch(o, mismatch);
    return false;
}

考虑到结果的生成方式,在不匹配消息中添加额外的语言(例如“不匹配,因为”)可能会让事情变得更清楚。 open pull request 建议 Hamcrest 可以使描述更清晰,但也有不明确的边缘情况。

请参阅 Strange AllOf hamcrest matcher mismatch description 了解类似的问题,涉及现有匹配器而不是自定义匹配器。

关于java - 编写与 Hamcrest AllOf/CombinableMatcher 匹配器配合良好的自定义匹配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24762380/

相关文章:

c++ - GoogleMock:如何精确预期具有特定参数的一次调用,并查看失败诊断?

java - 我希望 Java Pattern.compile 识别正整数或负整数或小数

java - 您如何断言 `Collection` 的 `Collection` 包含包含某些元素的元素?

java - Pattern、Matcher、replace的用法

java - 多个文件共享一个字符串

java - 如何调用带参数的方法?

java - NoClassDefFoundError : Could not initialize class sun. awt.X11FontManager

java - JUnit5:如何通过单个断言调用断言一个对象的多个属性?

java - `Matchers.hasItem` 和 `Matchers.contains` 相同吗?

java - gradle可以自动创建META-INF、WEB-INF文件夹和web.xml吗?