两个具有相同内容的ArrayList在JUNIT中不匹配

时间:2014-02-02 17:18:09

标签: java arraylist junit

我对jUnit和ArrayList

有一点问题

这是我的问题:

我需要测试同一对象的2个ArrayList(它被调用的ArticuleED)所以...在jUnit中我做下一个代码来比较结果和实际:

PersistenciaListas instance = new PersistenciaListas();
    List<ArticuloED> actual = new ArrayList<>();
    List<ArticuloED> result;

    //Objects to add
    //Videojuego is a subclass of Articulo(superclass)
    ArticuloED articuloED1 = new ArticuloED(new Videojuego("VJ0011", "ULTRA Street Fighter 4", "Peleas", "T", "PS4", "Capcom", 5),10,10);
    ArticuloED articuloED2 = new ArticuloED(new Videojuego("10", "Super Smash Bros Project M", "Peleas", "T", "Nintendo Wii", "Team M", 3));

    //add elements to instance
    //"Inventariar" is like add to the inventory
    //That 10 is the number of items you will add to existence and availability
    instance.inventariar((Videojuego) articuloED1.getArticulo(),10);

    //Verified if they have the same elements
    //that 10 and 10 are the 10 we added at inventariar, the first number is the existence
    //the other is the availability
    resultado = instance.consultarInventarioVideojuegos();
    esperado.add(new ArticuloED(new Videojuego("VJ0011", "ULTRA Street Fighter 4", "Peleas", "T", "PS4", "Capcom", 5),10,10));
    assertEquals(actual, result);

这是我在测试类中使用的代码

我得到的错误是下一个:

  

预期:java.util.ArrayList&lt; [VJ0011,ULTRA Street Fighter 4,10,10]&gt;但是:java.util.ArrayList&lt; [VJ0011,ULTRA Street Fighter 4,10,10]&gt; persistencia.PersistenciaListasTest.testConsultarInventarioVideojuegos(PersistenciaListasTest.java:492)中的junit.framework.AssertionFailedError

4 个答案:

答案 0 :(得分:2)

您正在比较两种非原始数据类型。 assertEquals方法返回false,因为对于非原始数据类型(在您的情况下,两个列表实际和结果),它检查对象引用的相等性而不是对象内容。

要解决此问题,您可以做两件事:

1)您可以访问对象的原始属性,并将它们与assertEquals方法进行比较。

2)您可以编写自己的方法来执行对象比较,然后通过运行

将其集成到JUnit中
assertEquals(true, myComparison(actual, result));

public boolean myComparison(ArrayList<ArtuculoED> first, ArrayList<ArticuloED> second){

// return true, if contents equal and false if not

}

答案 1 :(得分:1)

assertEquals不会“深度搜索”两个类的相等性,而是使用测试对象的equals()方法。即使toString()可能返回相同的内容,您也必须循环每个元素以测试单个相等:

assertEquals(actual.size(), result.size());
for (int i = 0; i < actual.size(); i++)
    assertEquals(actual.get(i), result.get(i));

答案 2 :(得分:1)

您的域类(ArticuloEDVideojuego)应覆盖equals()hashCode()方法,以便两个列表的内容相同。

答案 3 :(得分:0)

正如@fedorSmirnov已经写过的那样,你正在将两个非原始数据类型与equal进行比较,这样做不会达到你想要的效果。

我建议您使用AssertJ,其中asserts for Lists(以及更多类)。