如何使用来自Hamcrest的TestNG和hasItem
来匹配空集合?这是我通过一次测试得到的结果。
java.lang.AssertionError:
Expected: a collection containing email = null phone = null
got: <[]>
这是我的匹配课程:
private static class MyPersonMatcher extends TypeSafeMatcher<Person> {
private final String email;
private final String phone;
public ContactAgentUsageMatcher() {
}
public ContactAgentUsageMatcher(String email, String phone, Integer listingId) {
this.email = email;
this.phone = phone;
}
@Override
public void describeTo(Description description) {
description.appendText("email = ");
description.appendValue(this.email);
description.appendText(" phone = ");
description.appendValue(this.phone);
}
@Override
public boolean matchesSafely(ContactAgentUsage contactAgentUsage) {
if ((this.email == null) && (this.phone == null)) {
return true;
}
else {
return ObjectUtils.equals(this.email, contactAgentUsage.getEmail())
&& ObjectUtils.equals(this.phone, contactAgentUsage.getPhone());
}
}
}
失败的测试是
assertThat(argument.getAllValues(), hasItem(expectedMatcher));
其中expectedMatcher
由数据提供者提供。因此我不确定要传递什么来匹配这个“空集合”。我正在传递默认构造函数,但我知道这不起作用,因为它使用null
成员创建集合。
这是我的数据提供者的一部分:
{ new ContactAgentUsageMatcher()}
答案 0 :(得分:2)
当配置的Person
和email
都设置为name
时,您的自定义匹配器将匹配任何现有null
。但是,该集合不包含要匹配的任何 Person
。 Hamcrest的hasItem(matcher)
在这种情况下未通过测试,并且是用于空集合的错误匹配器。
以下是两种解决方法:
更改数据提供者和测试以获取包含hasItem
的完整匹配器。对于上述情况,您将通过emptyIterable
。缺点是你需要告诉Java编译器它应该使用哪种通用类型,这会使测试变得混乱。
创建第二个测试来处理产生空集合的数据集。