我刚刚开始测试。
我试图测试的方法没有返回值(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);
}
}
我有两个问题:
我是否可以像我一样与静态变量进行比较(
test.table
)即。这实际上会返回已完成表格的“实例”吗?我相当确定 2D 数组没有
assertArrayEquals
等效项,那么我该怎么做呢?答案已经给出,但为了其他用户,我将添加另一种方法。
要比较两个数组
double[][] arr1, arr2
,可以使用 Arrays.deepequals(arr1, arr2)
,它返回 true
或 false
。该函数的签名是:
java.util.Arrays.deepEquals(Object[] a1, Object[] a2)
对于单元测试,一行就足够了:
assertTrue(Arrays.deepEquals(arr1, arr2));
这里有一个
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);
}
}
}
答案:
是的,静态变量将返回已完成的实例 表,假设在
setTable()
结束时设置
完成表格到 table
变量。如果你不这样做,那么它就不会有
正确的实例。
但是,从设计的角度来看,最好 有一个访问器方法,例如
getTable()
表示已完成的表格(如果您正在设置)
它是 MyClass
中的变量,但这是一个不同的问题。为了测试是否创建了 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]);
}
}
AssertJ 现在提供 Assertions.isDeepEquals,它可以提供更好的输出(请参阅 https://stackoverflow.com/a/66935173/411282)