Java 如何使用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);

尝试检查将模块对象添加到数组的方法是否正常工作。我如何编写一个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
应该可以工作。你要寻找的概念是两者之间的区别,这与两者之间的区别有关

如果两个数组具有相同的长度,并且包含完全相同的基元值和引用,那么很容易说它们相等:
[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时是否不会更改?