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

Akk*_*rek 2 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);   

}
Run Code Online (Sandbox Code Playgroud)

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

  1. 在第一个addCell(3,2);数组的大小= 1后,其中一个元素的坐标为(3,2)
  2. addCell(4,2);数组后大小= 2,两个元素的坐标为(4,2)
  3. addCell(1,3);阵列具有尺寸= 3的COORDS的三个元件(1,3)

等等.

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

Jon*_*eet 6

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

// Remove the cellCoords field

private void addCell(int col, int row) {
    Coords cellCoords = new Coords(col, row);    
    startingCells.add(cellCoords);
}
Run Code Online (Sandbox Code Playgroud)

(这是假设一个合理的Coords构造函数.如果没有一个,你需要创建一个实例,然后调用setColssetRows......但你仍然会每次都创建一个新的对象,如果Coords是你的控制之下,你可以确保它确实有一个合适的构造函数,并使其更具可读性Coordinate,使用columnrow属性,甚至xy......我建议将其设置为final和immutable.)