Java 如何使用JUnit测试对象数组
尝试检查将模块对象添加到数组的方法是否正常工作。我如何编写一个JUnit测试来测试一个对象是否确实被添加到了数组中 以下是我到目前为止的情况:Java 如何使用JUnit测试对象数组,java,arrays,junit,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);
@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
应该可以工作。你要寻找的概念是两者之间的区别,这与两者之间的区别有关
如果两个数组具有相同的长度,并且包含完全相同的基元值和引用,那么很容易说它们相等:[0,1]
等于[0,1]
,即使数组本身是不同的对象,而[csc8001,csc8002]
和[csc8001,csc8002]
也会发生同样的情况。这就是所谓的“浅”等式,它的计算速度非常快
如果您实际上希望使用对象的equals
方法来比较对象,则需要“深度”相等。这将检查条目的正确数量,并检查所有n
的x[n].=y[n])
。这可能需要更长的时间,因为Java不能只比较引用;它实际上在对象上调用一个方法。但是,这仅在覆盖等于时对您有价值;如果您的模块没有覆盖equals
,它将使用对象的内置equals
方法,其作用方式与=
相同
在任何情况下,文档中都不是很清楚,但是调用,这基本上起到了作用
这就给您留下了三个选择:
- 继续使用
assertarayequals
。这就是它的目的,因为相等的引用意味着相等的对象,所以这样做是正确的
- 继续使用
assertArrayEquals
,但也要编写一个Module.equals
方法来证明数据本身是相同的。请记住,这只是一个问题,如果您想证明两个不同的实例根据其数据表现为相等,那么您现在可能不必担心这一点
- 如Jason所述,列出您正在测试的内容,它确认数据是正确的,而无需编写
equals
方法:
assertEquals(2, resultArray.length);
Module addedModule = resultArray[1];
assertEquals("CSC8002", addedModule.code); /* ... */
如果您尝试重写equals
,请小心:您需要维护一些规则,还需要重写hashCode
你的测试已经正确了。或者,您想测试Student.moduleRecords中的模块在更改csc8001时是否不会更改?