hasProperty
可与hasItem
一起使用,以检查给定属性的值,例如:
Matcher hasName = Matchers<Person>hasProperty("name", is("Winkleburger"));
assertThat(names, hasItem(hasName));
当name是一个属性时,这很好,即:有一个名为getName()
的方法。
是否有匹配器将检查不是属性的方法?ie:在这种情况下,它将检查集合中项的方法name()
的返回值,而不是getName()
。
你可以自己写一个:
public class HasName extends TypeSafeMatcher<MyClass> {
private String expectedName;
private HasName(String expectedName) {
this.expectedName = expectedName;
}
@Override
public boolean matchesSafely(MyClass obj) {
return expectedName.equals(obj.name());
}
@Factory
public static Matcher<MyClass> hasName(String expectedName) {
return new HasName(expectedName);
}
}
其中MyClass
是定义name()
方法的类或接口。
您可以使用另一个内置的Hamcrest,一个FeatureMatcher。在将您的输入转换为其他内容后,这些匹配器被设计为与其他匹配器组合。因此,在您的情况下,您可以这样做:
@Test
public void test1() {
List<Person> names = new ArrayList<>();
names.add(new Person("Bob"));
names.add(new Person("i"));
assertThat(names, hasItem(name(equalTo("Winkleburger"))));
}
private FeatureMatcher<Person, String> name(Matcher<String> matcher) {
return new FeatureMatcher<Person, String>(matcher, "name", "name") {
@Override
protected String featureValueOf(Person actual) {
return actual.name();
}
};
}
与自定义匹配器相比,您将获得的好处是,它完全可重用,并且可以与其他匹配器组合,因为它所做的只是数据提取,然后服从于您想要的任何其他匹配器。您还将获得适当的诊断,例如,在上面的示例中,如果您将断言更改为不存在的值,您将收到:
java.lang.AssertionError:
Expected: a collection containing name "Batman"
but: name was "Bob", name was "Winkleburger"
我正试图将Hamcrest匹配器引入到我的团队的一些代码中。为了消除匹配实例集合的复杂性,我想为我的每个匹配器编写一个帮助器方法,我希望匹配的集合。所以本质上,我是在包装容器InAnyOrder。也就是说,如果有人以null作为预期和实际传递,我希望它匹配。但是按照我编写代码的方式,如果为预期传递null,它将抛出一个NullPointerExcION。所以我想返回一个IsNull匹配器,如果nu
我正在编写一些JUnit/Akruillian类测试,用Hibernate测试一些持久性方法。因此,我必须从数据库中获取许多Hibernate实体列表,并且为了更好地编写测试,我正在使用JUnit Hamcrest框架。在这一刻,我想使用组合匹配器,特别是其中之一。我知道我可以用方法替换它,但出于代码易读性的原因,我更喜欢组合匹配器。我不明白如何使用
我有一个正在测试的方法,它返回一个对象列表。。。例如“Person”对象。 我有一个“预期的最后名字”列表来验证结果。 我目前有一个工作测试,它循环遍历“expectedLastNames”中的名称,并断言每个名称都包含在“Person”对象列表中。与此类似(请注意,以下代码段位于Kotlin中): 当断言通过时,这非常有效,并验证了我的方法。然而,当测试失败时,这是非常麻烦的,因为一旦遇到缺少的
问题内容: 我有日期Ymd格式的数组,该格式可以是相隔一天的十个设置日期的任意组合。 例如:这是全套: 2011-01-01、2011-01-02、2011-01-03、2011-01-04、2011-01-05、2011-01-06、2011-01-07、2011-01-08、2011- 2011年1月9日至01日 从该集合创建的数组可以是日期的任何组合-所有日期,其中一个日期,一些连续日期,所
输入: null 目标是使以下语句可编译: 这里有什么用?它想让我<编码>匹配器<?super java.util.list >并告诉我通过了 。那么如何在这里传递匹配器集合呢? 有一个关于将集合与hamcrest进行比较的问题,但没有传递Matchers集合的示例,而不是元素。
它看起来像hamcrest(尽管看起来,还有更多)。为什么我会选择使用(除了看起来类稍微小一点之外),为什么这两个类如此相似?