尝试检查将模块对象添加到数组的方法是否正常工作。我如何编写一个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 );
}
我遇到的问题是数组只是存储对象的引用,我如何测试以查看数组是否存储了正确的信息?
答案 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); /* ... */
,请注意:您需要遵守某些规则,并且您还需要覆盖equals
。 Read more here.
答案 1 :(得分:0)
强力方法是检查数组是否具有预期的条目数,然后存储在数组中的每个对象都具有预期的属性值。