1

如何使用 TestNG 和hasItemHamcrest 匹配一个空集合?这是我通过一项测试得到的结果。

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()}
4

1 回答 1

2

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

这里有两个解决方法:

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

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

于 2012-09-08T20:45:54.780 回答