Junit 测试中的 Java ArrayList 填充单个值

标签 java arrays junit

我有以下 Junit 类用于测试(不包括测试,因为它们在这种情况下并不重要):

public class BoardImplTest {

List<Coords> startingCells = new ArrayList<>();
Coords cellCoords = new Coords();


private void addCell(int col, int row){
    cellCoords.setCols(col);
    cellCoords.setRows(row);

    startingCells.add(cellCoords);
}

private void testSetup() {
    addCell(3,2);       

    addCell(4,2);

    addCell(1,3);

    addCell(2,3);

    addCell(3,3);

    addCell(4,4);   

}

运行is后,数组startingCells只填充一个值:

  1. 第一个之后 addCell(3,2);数组的 size=1,其中一个元素的坐标为 (3,2)
  2. addCell(4,2);之后数组的大小=2,两个元素的坐标为(4,2)
  3. addCell(1,3);之后数组的大小=3,三个元素的坐标为(1,3)

等等。

每次调用 addCell 后,数组都会增加其大小,并且所有字段都会填充作为参数传递的值,并且我希望这些值仅作为数组的最后一个元素添加。问题出在哪里?

最佳答案

您正在创建 Coords单个实例,并在变异后每次调用 addCell 时添加对该单个对象的引用它。您应该每次创建一个Coords实例,例如

// Remove the cellCoords field

private void addCell(int col, int row) {
    Coords cellCoords = new Coords(col, row);    
    startingCells.add(cellCoords);
}

(假设有一个合理的 Coords 构造函数。如果没有,您需要创建一个实例,然后调用 setColssetRows...但每次您仍然会创建一个新对象。如果坐标在您的控制之下,您可以确保它确实有一个合适的构造函数,并使其更具可读性,如 坐标,具有 columnrow 属性,甚至 x >y...我建议将其设为最终且不可变。)

关于Junit 测试中的 Java ArrayList 填充单个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38563980/

相关文章:

java - 使用 hiverunner 进行单元测试中的 MissingTableException

javascript - 比较和删除 JavaScript 数组中的值

arrays - Groovy代码将字符串数组插入Oracle表

arrays - float 的连续子数组求和为整数算法

java.lang.Exception : Test class should have exactly one public constructor

java - 在数据库中搜索关键字

java - 我无法修改我的 boolean 字段?

java - Android:并发后台作业的设计(Service、IntentService 还是 AsyncTask?)

java - 如何将 utc 中的日期时间格式化为本地时间格式?

java - 在 Hudson 中通过 JUnit 运行 Selenium 测试