Java 如何使用集合返回对集合参数进行单元测试?
我有一个方法,它接受T类型的集合作为参数,并返回Integer类型的集合。在这个特定的实例中,我试图返回一个ArrayList(我这样做是错误的吗?我想既然ArrayList继承了一个集合,那应该没问题)Java 如何使用集合返回对集合参数进行单元测试?,java,unit-testing,generics,arraylist,collections,Java,Unit Testing,Generics,Arraylist,Collections,我有一个方法,它接受T类型的集合作为参数,并返回Integer类型的集合。在这个特定的实例中,我试图返回一个ArrayList(我这样做是错误的吗?我想既然ArrayList继承了一个集合,那应该没问题) @Test public void Test(){ 集合列表=新的ArrayList(); 增加(2); 增加(8); 增加(7); 增加(3); 增加(4); 比较comp=新的比较(); int低=1; int高=5; ArrayList实际值=SampleClass.range(列表、低
@Test public void Test(){
集合列表=新的ArrayList();
增加(2);
增加(8);
增加(7);
增加(3);
增加(4);
比较comp=新的比较();
int低=1;
int高=5;
ArrayList实际值=SampleClass.range(列表、低位、高位、复合);
应为ArrayList=新的ArrayList();
增加(2);
增加(3);
增加(4);
Assert.assertEquals(预期、实际);
}
我做错了什么
编辑:
根据要求,以下是讨论的方法:
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;
}
公共静态采集范围(采集coll、T低、T高、,
比较器(comp){
如果(coll==null | | comp==null){
抛出新的IllegalArgumentException(“无集合或比较器”);
}
如果(coll.size()==0){
抛出新的NoSuchElementException(“集合为空”);
}
ArrayList al=新的ArrayList();
for(T:coll){
如果(comp.compare(t,low)>=0和&comp.compare(t,high)则建议将返回的集合复制到ArrayList
,然后可以使用equals()
将其与另一个ArrayList
进行比较。这会使代码编译,并可能让测试通过
潜在的解决方案包括将结果强制转换或将其复制到不同类型的容器中,这一事实引发了一些关于这里实际发生了什么的问题
将结果集合
复制到列表中
可能会对范围()
方法。它声明返回一个集合
。如果您的测试被修改为将结果复制到列表
,并将其与预期结果(也是列表
)进行比较,则测试将约束范围()
实现以特定顺序生成其结果。如果顺序重要,则可能是范围()
应修改为使用并返回列表
,而不是集合
但是,如果顺序无关紧要怎么办?如果返回的集合包含[4,3,2]
而不是[2,3,4]
,这是否可以接受?如果可以,则需要以与顺序无关的方式比较实际结果和预期结果。有关实现这一点的技术,请参阅以下问题:
错误是什么?你能粘贴SampleClass.range的代码吗?它给我一个不兼容的类型错误:不兼容的类型:集合无法转换为ArrayListArrayList actual=new ArrayList(SampleClass.range(列表,低,高,comp))
?这似乎很有效。谢谢!你能解释一下背后的语法吗?@Alvarno Collection不能分配给ArrayList。你需要添加一个强制转换或按照Andy的建议执行。也就是说,你能展示接受Collection并返回Collection的方法吗?
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;
}