如何使用JUnit测试对象数组

时间:2014-04-10 00:23:46

标签: java arrays junit

尝试检查将模块对象添加到数组的方法是否正常工作。我如何编写一个JUnit测试来测试一个对象是否确实被添加到数组中?

这是我到目前为止所做的:

@Test
public void testAddModule() {
    Student chris = new Student("Chris", "1");
    Module csc8001 = new Module("CSC8001", "Programming and data structures", 5, 5, 0, 7);
    Module csc8002 = new Module("CSC8002", "Programming II", 5, 5, 0, 7);   
    chris.addModule(csc8001);
    chris.addModule(csc8002);


    Module [] expectedResult = {csc8001,csc8002};
    ModuleRecord[] resultArray = Student.moduleRecords;

    Assert.assertArrayEquals( expectedResult, resultArray );

}

我遇到的问题是数组只是存储对象的引用,我如何测试以查看数组是否存储了正确的信息?

2 个答案:

答案 0 :(得分:1)

您正走在正确的轨道上:assertArrayEquals应该有效。您正在寻找的概念是shallow equals ("==") and deep equals (".equals")之间的差异,它与reference equality ("==") and object equality (".equals")之间的差异有关。

如果两个数组具有相同的长度,并且包含完全相同的原始值和引用,则很容易说它们相等:[0, 1]等于[0, 1]即使数组本身是不同的对象,[csc8001, csc8002][csc8001, csc8002]也是如此。这被称为"浅"平等,计算速度非常快。

如果您真的希望使用equals方法比较对象,则需要"深度"平等。这将检查正确的条目数,并检查所有x[n].equals(y[n])的{​​{1}}。这可能需要更长时间,因为Java不能仅仅比较引用;它实际上调用了对象的方法。但是,如果您覆盖n,这只对您有价值;如果您的模块没有覆盖equals,则它会使用对象的内置equals方法,该方法的行为方式与equals相同。

在任何情况下,文档中都不是很清楚,但Assert.assertArrayEquals调用Assert.internalArrayEquals,基本上会deep comparison using .equals

这给你留下了三个选择:

  • 继续使用==。这就是它的用途,因为平等的引用意味着平等的对象,所以它是正确的。
  • 继续使用assertArrayEquals,但也写一个assertArrayEquals方法来证明数据本身是相同的。请记住,如果您想证明两个不同的实例基于其数据表现得相同,那么这只是一个问题,您现在可能不必担心这一点。
  • 正如杰森所提到的那样,突破你正在测试的内容,确认数据是正确的而不用你编写Module.equals方法:

    equals

如果您尝试覆盖assertEquals(2, resultArray.length); Module addedModule = resultArray[1]; assertEquals("CSC8002", addedModule.code); /* ... */ ,请注意:您需要遵守某些规则,并且您还需要覆盖equalsRead more here.

答案 1 :(得分:0)

强力方法是检查数组是否具有预期的条目数,然后存储在数组中的每个对象都具有预期的属性值。