我需要编写将检查多个属性的匹配器。对于我使用的单个属性:
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
的方式(,但您需要编写自己的describeTo
和describeMismatch
(Safely
(实现,以获得hasProperty
定义的以及allOf
为您聚合的全面错误消息。
您可能会发现,对于涉及几个简单匹配器的简单情况,使用 allOf
是明智的,但如果匹配大量属性或实现复杂的条件逻辑,请考虑编写自己的匹配器。