我需要编写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));
我怎么想在一个匹配器中检查更多属性?
答案 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
是结合匹配器的最佳方式,但您也可以选择根据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
和{{1} (describeMismatch
)实现,以获取Safely
定义的全面错误消息,hasProperty
将为您聚合。
对于涉及几个简单匹配器的简单情况,您可能会发现使用allOf
是明智的,但如果匹配大量属性或者实现复杂的条件逻辑,请考虑编写自己的。