我想使用assertArrayEquals(ArrayList<Token>, ArrayList<Token>)
这些参数(即标记的arrayList)。但是 Java 告诉我我需要创建这样一个方法。有没有办法测试 Junit 中任何类型的两个数组列表的相等性?
6 回答
我想使用
assertArrayEquals(ArrayList<Token>, ArrayList<Token>)
这些参数(即标记的arrayList)。但是 Java 告诉我我需要创建这样一个方法。
它告诉您需要创建该方法,因为 JUnit 库中没有这样的方法。JUnit 库中没有这样的方法,因为它assertArrayEquals
用于比较数组,并且ArrayList
不是数组——它是一个.List
有没有办法测试 Junit 中任何类型的两个数组列表的相等性?
ArrayLists
您可以使用 来检查两个(实际上是任何两个List
对象)的相等性equals
,因此您应该能够使用 JUnit 的assertEquals
方法并且它会正常工作。
您可能想要使用的是void org.junit.Assert.assertArrayEquals(Object[] expecteds, Object[] actuals)
. 您只需要使用toArray()
方法将 List 转换为数组,如下所示:
ArrayList<Token> list1 = buildListOne(); // retrieve or build list
ArrayList<Token> list2 = buildListTwo(); // retrieve or build other list with same items
assertArrayEquals(list1.toArray(), list2.toArray());
不要忘记导入这个断言。
import static org.junit.Assert.assertArrayEquals;
但这种方法仅在两个列表中的项目具有相同顺序时才有效。如果无法保证顺序,则需要使用Collections.sort()
方法对列表进行排序,但您的对象需要java.util.Comparable
使用一种方法实现接口int compareTo(T o)
。
PS:另一种可能的解决方案是使用 assertEquals 并将您的列表包装到 Set 中,如下所示:
assertEquals(new HashSet<Token>(list1), new HashSet<Token>(list2));
想象一下myArraylist
是一个包含内容的数组列表"one", "two", "three"
这工作正常:
List<String> categories = asList("one", "two", "three");
assertTrue(myArraylist.equals(categories));
不要忘记导入:import static java.util.Arrays.asList;
尝试
Assert.assertEquals(Object expected, Object actual);
它适用于 Collections
您可以覆盖元素类型的“equals”或“hashcode”方法,例如:ArralyList、ArrayList -(原始数据类型或自定义数据元素),您可以覆盖该方法,并比较该方法中的所有数据并返回 true/相应地为假。
然后,您可以直接将 assertEquals(arraylist1 , arraylist2) 用于您的 junit 测试。
下面是示例对象类
public class Customer {
String name;
int age;
@Override
public boolean equals(Object obj) {
if(this == obj)
return true;
// it checks if the argument is of the type Customer by comparing the classes
// of the passed argument and this object.
// if(!(obj instanceof Customer)) return false; ---> avoid.
if(obj == null || obj.getClass()!= this.getClass())
return false;
// type casting of the argument.
Customer customer = (Customer) obj;
if(customer.getName().equals(this.name) &&
(customer.getAge() == this.age))
return true;
return false;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
下面是 Junit 测试的示例类:
public class CustomerTest {
@Test
public void testCustomerMatch() {
ArrayList<Customer> expectedCustomerListOutput; // add your data in this list
ArrayList<Customer> actualCustomerListOutput;// add your data in this list
//used the overridden equal method of trade objects
assertEquals(expectedTradeOutput, actualTradeMatchList);
}
}
如果您使用一些现成的 junit 框架,例如 unitils 等,它们具有诸如 assertReflectionEquals 之类的方法(类似于其他框架),您可以在其中使用任何两个对象反射。如果您不使用任何第三方 junit 框架,您可以编写自己的类似通用方法。