java - 如何使用 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);
    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 方法来比较对象,则需要“深度”相等。这会检查条目数量是否正确,并检查所有 nx[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,请小心:您需要遵守一些规则,并且还需要重写hashCodeRead more here.

关于java - 如何使用 JUnit 测试对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22976404/

相关文章:

java - id 的数据类型应该是什么?

java - 如何访问实例中的数组

java - 无法将文本设置为 TextWatcher 中的 EditView

javascript - 值存储在不同的数组中而不是单个数组中

java - 如何为将目录复制到目录的 API 编写 JUnit 测试

java - 将方向键焦点更改保持​​在当前 fragment 内

javascript - 查找数组中数组元素的索引

arrays - Postgres : array of NULL values

java - 使用命令行从 JUnit 类运行单个测试

java - 在 Spring 中进行 Junit 测试自定义过滤器