具有内存地址的junit AssertionFailedError

时间:2017-06-10 00:02:36

标签: java junit

我是单元测试的新手。我正在测试一个“标记”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。看起来那些是内存地址(我是初学者)。 我做错了断言(比较指针或其他东西)?

2 个答案:

答案 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,添加一个显示该断言的断言消息参数。