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

时间:2016-02-16 15:52:13

标签: java mockito matcher hamcrest

我需要编写Matcher来检查多个属性。对于我使用过的单一财产:

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));

我怎么想在一个匹配器中检查更多属性?

2 个答案:

答案 0 :(得分:15)

您可以通过将匹配器与allOf

组合使用,使用一个匹配器检查更多属性
    Matcher<Class> matcherName = allOf(
        hasProperty("propertyName", equalTo(expected1)),
        hasProperty("propertyName2", equalTo(expected2)));

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

    assertThat(yourBean, samePropertyValuesAs(expectedBean));

答案 1 :(得分:3)

Ruben's answer使用allOf是结合匹配器的最佳方式,但您也可以选择根据BaseMatcherTypeSafeMatcher从头开始编写自己的匹配器:

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

虽然您可以无限制地编写任意匹配器代码而不依赖于反射(hasProperty的方式),但您需要编写自己的describeTo和{{1} (describeMismatch)实现,以获取Safely定义的全面错误消息,hasProperty将为您聚合。

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