我是单元测试的新手。我正在测试一个“标记”String
的函数。 String
是一个数学表达式。这是我的代码:
@Test
public void testTokenizer() throws InvalidExpressionException {
final String QUERY = "sin(x) / 5*x";
final String[] EXPECTED = {"x", "sin", "5", "x", "*", "/"};
parser.parse(QUERY);
final String[] actual = parser.getTokens().toArray(new String[parser.getTokens().size()]);
Assertions.assertEquals(EXPECTED, actual);
}
这是我得到的错误:
org.opentest4j.AssertionFailedError:
Expected :[Ljava.lang.String;@62043840
Actual :[Ljava.lang.String;@5315b42e
我正在使用junit5。看起来那些是内存地址(我是初学者)。 我做错了断言(比较指针或其他东西)?
答案 0 :(得分:3)
使用Assert.assertArrayEquals
进行数组比较,您要比较对象中的ID
import org.junit.Assert;
@Test
public void testTokenizer() throws InvalidExpressionException {
final String QUERY = "sin(x) / 5*x";
final String[] EXPECTED = {"x", "sin", "5", "x", "*", "/"};
parser.parse(QUERY);
final String[] actual = parser.getTokens().toArray(new String[parser.getTokens().size()]);
Assert.assertArrayEquals( EXPECTED, actual );
}
答案 1 :(得分:2)
那些不是内存地址,它们是包含对象哈希码的对象标识符。数组的toString
方法返回数组的对象标识符。
http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#toString-- "类Object的toString方法返回一个字符串,该字符串由对象为实例的类的名称,符号字符“@'”和哈希码的无符号十六进制表示形式组成。对象。"
阵列版本包含一些额外的字符,表明它是一个数组。
您测试的方法没有返回预期值。那是因为你有两个不同的数组,而数组只有身份而不是内容。所以它们不能相等,除非它们是完全相同的数组对象。您需要声明数组 contents 比较相等。
顺便提一下,变量名EXPECTED
违反了Java命名约定,因为所有带有下划线的大写都是为常量变量名保留的,或者至少是指向不可变对象的变量。
如果您的目标是断言消息显示数组' content,添加一个显示该断言的断言消息参数。