26

我想使用assertArrayEquals(ArrayList<Token>, ArrayList<Token>)这些参数(即标记的arrayList)。但是 Java 告诉我我需要创建这样一个方法。有没有办法测试 Junit 中任何类型的两个数组列表的相等性?

4

6 回答 6

32

我想使用assertArrayEquals(ArrayList<Token>, ArrayList<Token>)这些参数(即标记的arrayList)。但是 Java 告诉我我需要创建这样一个方法。

它告诉您需要创建该方法,因为 JUnit 库中没有这样的方法。JUnit 库中没有这样的方法,因为assertArrayEquals用于比较数组,并且ArrayList不是数组——它是一个.List

有没有办法测试 Junit 中任何类型的两个数组列表的相等性?

ArrayLists您可以使用 来检查两个(实际上是任何两个List对象)的相等性equals,因此您应该能够使用 JUnit 的assertEquals方法并且它会正常工作。

于 2013-03-17T02:59:02.010 回答
11

您可能想要使用的是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));
于 2013-09-18T12:41:58.020 回答
6

想象一下myArraylist是一个包​​含内容的数组列表"one", "two", "three"

这工作正常:

 List<String> categories = asList("one", "two", "three");
 assertTrue(myArraylist.equals(categories));

不要忘记导入:import static java.util.Arrays.asList;

于 2015-11-18T19:42:59.723 回答
4

尝试

Assert.assertEquals(Object expected, Object actual);

它适用于 Collections

于 2013-03-17T04:15:21.120 回答
2

您可以覆盖元素类型的“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);
}

}

于 2019-08-15T16:54:17.710 回答
1

如果您使用一些现成的 junit 框架,例如 unitils 等,它们具有诸如 assertReflectionEquals 之类的方法(类似于其他框架),您可以在其中使用任何两个对象反射。如果您不使用任何第三方 junit 框架,您可以编写自己的类似通用方法。

于 2013-03-17T02:22:47.737 回答