【问题标题】:How do I unit test for a Collection parameter with an Collection return?如何对具有集合返回的集合参数进行单元测试?
【发布时间】:2016-02-10 05:50:18
【问题描述】:

我有一个方法,它接收一个 T 类型的集合作为参数,并返回一个整数类型的集合。在这个特定的例子中,我试图返回一个 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;
}

【问题讨论】:

  • 错误是什么?您能否粘贴 SampleClass.range 的代码。
  • 它给了我一个不兼容的类型错误:不兼容的类型:Collection 无法转换为 ArrayList
  • ArrayList&lt;Integer&gt; actual = new ArrayList&lt;&gt;(SampleClass.&lt;Integer&gt;range(list, low, high, comp));?
  • 这似乎奏效了。谢谢!你能解释一下这背后的语法吗?
  • @Alvarno Collection 不能分配给 ArrayList。您需要添加演员表或按照安迪的建议进行操作。也就是说,您能否展示采用 Collection 并返回 Collection 的方法?

标签: java unit-testing generics arraylist collections


【解决方案1】:

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

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

将结果 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?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-16
    • 2022-12-15
    • 2018-09-21
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多