尝试检查将模块对象添加到数组的方法是否正常工作。如何编写 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 );
}
我遇到的问题是数组只是存储对对象的引用,如何测试数组是否存储了正确的信息?
最佳答案
您的方向是正确的:assertArrayEquals
应该可以工作。您正在寻找的概念是 shallow equals ("==
") and deep equals (".equals
") 之间的区别,这与 reference equality ("==
") and object equality (".equals
") 之间的差异有关.
如果两个数组具有相同的长度,并且包含完全相同的基元值和引用,则很容易说它们相等:[0, 1]
等于 [0, 1]
,即使数组本身是不同的对象,[csc8001, csc8002]
和 [csc8001, csc8002]
也会发生同样的情况。这被称为“浅层”相等,并且计算速度非常快。
如果您实际上希望使用对象的 equals
方法来比较对象,则需要“深度”相等。这会检查条目数量是否正确,并检查所有 n
的 x[n].equals(y[n])
。这可能需要更长的时间,因为 Java 不能只比较引用;它还需要比较引用。它实际上调用对象上的方法。不过,只有当您覆盖 equals
时,这才对您有值(value);如果您的模块没有覆盖 equals
,它将使用对象的内置 equals
方法,其作用方式与 ==
相同。
无论如何,文档中都不是很清楚,但是Assert.assertArrayEquals
来电 Assert.internalArrayEquals
,它基本上执行 deep comparison using .equals
.
这给你提供了三个选择:
继续使用
assertArrayEquals
。这就是它的用途,因为相等的引用意味着相等的对象,所以这是正确的做法。继续使用
assertArrayEquals
,但还要编写Module.equals
方法来证明数据本身是相同的。请记住,只有当您想证明两个不同的实例根据其数据表现得相同时,这才是一个问题,而且您现在可能不必担心这一点。正如 Jason 提到的,分解您正在测试的内容,这无需您编写
equals
方法即可确认数据正确:assertEquals(2, resultArray.length); Module addedModule = resultArray[1]; assertEquals("CSC8002", addedModule.code); /* ... */
如果您尝试重写equals
,请小心:您需要遵守一些规则,并且还需要重写hashCode
。 Read more here.
关于java - 如何使用 JUnit 测试对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22976404/