在一个匹配器中匹配多个属性



我需要编写将检查多个属性的匹配器。对于我使用的单个属性:

import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.hasProperty;
import org.hamcrest.Matcher;
import org.hamcrest.Matchers;
    Matcher<Class> matcherName = Matchers.<Class> hasProperty("propertyName",equalTo(expectedValue));

我应该如何在一个匹配器中检查更多属性?

您可以通过将

匹配器与allOf组合来使用一个匹配器检查更多属性:

    Matcher<Class> matcherName = allOf(
        hasProperty("propertyName", equalTo(expected1)),
        hasProperty("propertyName2", equalTo(expected2)));

但我想您实际上正在寻找的是samePropertyValuesAs的,它通过检查属性本身而不是 equals 方法来检查一个 bean 是否与另一个 bean 具有相同的属性值:

    assertThat(yourBean, samePropertyValuesAs(expectedBean));

>Ruben 使用 allOf 的答案是组合匹配器的最佳方式,但您也可以选择基于 BaseMatcher 或 TypeSafeMatcher 从头开始编写自己的匹配器:

Matcher<Class> matcherName = new TypeSafeMatcher<Class>() {
  @Override public boolean matchesSafely(Class object) {
    return expected1.equals(object.getPropertyName())
        && expected2.equals(object.getPropertyName2());
  }
};

尽管您确实获得了无限的能力来编写任意匹配器代码而不依赖于反射(hasProperty的方式(,但您需要编写自己的describeTodescribeMismatch(Safely(实现,以获得hasProperty定义的以及allOf为您聚合的全面错误消息。

您可能会发现,对于涉及几个简单匹配器的简单情况,使用 allOf 是明智的,但如果匹配大量属性或实现复杂的条件逻辑,请考虑编写自己的匹配器。

相关内容

  • 没有找到相关文章

最新更新