如何使用Collection返回对Collection参数进行单元测试?

时间:2016-02-09 17:29:16

标签: java unit-testing generics arraylist collections

我有一个方法,它将类型T的Collection作为参数,并返回Integer类型的Collection。在这个特定的例子中,我正在尝试返回一个ArrayList(我做错了吗?我想,因为ArrayList继承自Collection,这应该没问题。)

@Test public void test() {
  Collection<Integer> list = new ArrayList<Integer>();
  list.add(2);
  list.add(8);
  list.add(7);
  list.add(3);
  list.add(4);
  Comparison comp = new Comparison();
  int low = 1;
  int high = 5;
  ArrayList<Integer> actual = SampleClass.<Integer>range(list, low, high, comp);
  ArrayList<Integer> expected = new ArrayList<Integer>();
  expected.add(2);
  expected.add(3);
  expected.add(4);
  Assert.assertEquals(expected, actual);
}

我在这里做错了什么?

编辑:

根据要求,这是讨论的方法:

public static <T> Collection<T> range(Collection<T> coll, T low, T high,
                                     Comparator<T> comp) {
  if (coll == null || comp == null) {
     throw new IllegalArgumentException("No Collection or Comparator.");
  }
  if (coll.size() == 0) {
     throw new NoSuchElementException("Collection is empty.");
  }
  ArrayList<T> al = new ArrayList<T>();
  for (T t : coll) {
     if (comp.compare(t, low) >= 0 && comp.compare(t, high) <= 0) {
        al.add(t);
     }
  }
  return al;
}

1 个答案:

答案 0 :(得分:0)

comment from Andy Turner建议将返回的集合复制到ArrayList,然后可以使用ArrayList将其与另一个equals()进行比较。这使代码编译并可能让测试通过。

潜在的解决方案包括投射结果或将其复制到不同类型的容器中这一事实引发了一些关于这里实际发生的事情的问题。

将结果Collection复制到List会对range()方法做出一些可能无根据的假设。它被宣布为返回Collection。如果您的测试被修改为将结果复制到List并将其与预期结果(也称为List)进行比较,则测试会约束range()实施以按特定顺序生成结果。如果订单很重要,可能应修改range()以使用并返回List而不是Collection

但是如果订单不重要怎么办?如果返回的集合包含[4, 3, 2]而不是[2, 3, 4],那是否可以接受?如果是这样,那么您需要以与订单无关的方式比较实际和预期结果。有关这方面的技巧,请参阅此问题:

Is there a way to check if two Collections contain the same elements, independent of order?