Junit 测试无效 2D 数组

问题描述 投票:0回答:4

我刚刚开始测试。

我试图测试的方法没有返回值(void),但它在自己的类中创建了一个静态二维数组(char[][]),所以根据我的理解,这是它的副作用。

这是一些模拟代码:

public class MyClass{

    public static char[][] table;

    public void setTable(int rows, int columns, int number){
        board = new char[n][m];
        // more code that alters the table in a specific way, 
        // depending on the 3rd parameter
    }

现在进行测试,我正在考虑做类似的事情:

public class SetTableTest{

    @Test
    public void test(){
        MyClass test = new MyClass();
        assertArrayEquals(**********, test.table);
    }
}

我有两个问题:

  1. 我是否可以像我一样与静态变量进行比较(

    test.table
    )即。这实际上会返回已完成表格的“实例”吗?

  2. 我相当确定 2D 数组没有

    assertArrayEquals
    等效项,那么我该怎么做呢?

java junit multidimensional-array
4个回答
7
投票

答案已经给出,但为了其他用户,我将添加另一种方法。

要比较两个数组

double[][] arr1, arr2
,可以使用
Arrays.deepequals(arr1, arr2)
,它返回
true
false
。该函数的签名是:

java.util.Arrays.deepEquals(Object[] a1, Object[] a2)

对于单元测试,一行就足够了:

assertTrue(Arrays.deepEquals(arr1, arr2));

2
投票

这里有一个

assertArrayEquals()
http://junit.sourceforge.net/javadoc/org/junit/Assert.html

所以你可以使用静态导入:

import static org.junit.Assert.assertArrayEquals;

然而,它只是“浅”数组等于,因此您需要实现逻辑本身。另请确保在断言之前调用

setTable()
。这是一些东西:

import static org.junit.Assert.assertArrayEquals;

public class SetTableTest{

    @Test
    public void test() {
        MyClass test = new MyClass();
        int foo = 42;
        int bar = 42;
        int baz = 42;
        test.setTable(foo, bar, baz)
        for (char[] innerArray : test.table) {
             assertArrayEquals(*****, innerArray);
        }
    }
}

1
投票

答案:

  1. 是的,静态变量将返回已完成的实例 表,假设

    setTable()
    结束时设置 完成表格到
    table
    变量。如果你不这样做,那么它就不会有 正确的实例。

    但是,从设计的角度来看,最好 有一个访问器方法,例如

    getTable()
    表示已完成的表格(如果您正在设置) 它是
    MyClass
    中的变量,但这是一个不同的问题。

  2. 为了测试是否创建了 2D 数组,我建议创建一个代表 2D 数组每一行的数组,例如

    char[] row0 == test.table[0]
    char[] row1 == test.table[1].
    

    您需要自己创建这些数组,并填充您期望在从

    setTable()
    创建的表中出现的值。然后你可以对每一行使用
    assertArrayEquals()
    。示例:

    public class SetTableTest{
    
        @Test
        public void test(){
            MyClass test = new MyClass();
            test.setTable(2, 2, 5);
            char[] row0 = {x, x} // This is whatever you would expect to be in row 0
            char[] row1 = {x, x} // This is whatever you would expect to be in row 1
            assertArrayEquals(row0, test.table[0]);
            assertArrayEquals(row1, test.table[1]);
        }
    }
    

0
投票

AssertJ 现在提供 Assertions.isDeepEquals,它可以提供更好的输出(请参阅 https://stackoverflow.com/a/66935173/411282

© www.soinside.com 2019 - 2024. All rights reserved.