将空集合与Hamcrest的hasItem()匹配

时间:2012-09-07 05:17:49

标签: java collections testng hamcrest

如何使用来自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()}

1 个答案:

答案 0 :(得分:2)

当配置的Personemail都设置为name时,您的自定义匹配器将匹配任何现有null。但是,该集合不包含要匹配的任何 Person。 Hamcrest的hasItem(matcher)在这种情况下未通过测试,并且是用于空集合的错误匹配器。

以下是两种解决方法:

  1. 更改数据提供者和测试以获取包含hasItem的完整匹配器。对于上述情况,您将通过emptyIterable。缺点是你需要告诉Java编译器它应该使用哪种通用类型,这会使测试变得混乱。

  2. 创建第二个测试来处理产生空集合的数据集。