Java 具有内存地址的junit断言失败错误

Java 具有内存地址的junit断言失败错误,java,junit,Java,Junit,我不熟悉单元测试。我正在测试一个标记字符串的函数。字符串是一个数学表达式。这是我的密码: @Test public void testTokenizer() throws InvalidExpressionException { final String QUERY = "sin(x) / 5*x"; final String[] EXPECTED = {"x", "sin", "5", "x", "*", "/"}; parser.parse(QUERY);

我不熟悉单元测试。我正在测试一个标记字符串的函数。字符串是一个数学表达式。这是我的密码:

@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。看起来这些是记忆地址我是个初学者。我是否做出了错误的断言比较指针或其他什么?

使用Assert.assertarayequals进行数组比较,您是在比较对象的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 );
}
使用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 );
}

这些不是内存地址,它们是包含对象哈希代码的对象标识符。数组的toString方法返回数组的对象标识符

class对象的toString方法返回一个字符串,该字符串由对象作为实例的类的名称、at符号字符“@”和对象哈希代码的无符号十六进制表示形式组成

数组版本包含几个额外的字符以表明它是一个数组

测试中的方法未返回预期值。这是因为您有两个不同的数组,数组仅在标识上相等,而在内容上不相等。所以它们不能相等,除非它们是完全相同的数组对象。您需要声明数组内容比较相等

顺便说一句,预期的变量名违反了Java命名约定,因为所有带下划线的大写字母都保留给常量变量名,或者至少是指向不可变对象的变量


如果您希望断言消息显示数组的内容,请添加一个断言消息参数,该参数显示。

这些不是内存地址,而是包含对象哈希代码的对象标识符。数组的toString方法返回数组的对象标识符

class对象的toString方法返回一个字符串,该字符串由对象作为实例的类的名称、at符号字符“@”和对象哈希代码的无符号十六进制表示形式组成

数组版本包含几个额外的字符以表明它是一个数组

测试中的方法未返回预期值。这是因为您有两个不同的数组,数组仅在标识上相等,而在内容上不相等。所以它们不能相等,除非它们是完全相同的数组对象。您需要声明数组内容比较相等

顺便说一句,预期的变量名违反了Java命名约定,因为所有带下划线的大写字母都保留给常量变量名,或者至少是指向不可变对象的变量


如果您希望断言消息显示数组的内容,请添加一个断言消息参数来显示该内容。

谢谢您提供的额外信息,我非常感谢。final和const不是一回事吗?或者我真的应该把它改成大写吗?const在Java中不是一个东西。严格来说,也就是说,根据Java语言规范JLS,常量变量是字符串类型的变量或使用常量表达式初始化的基元类型的变量。它得到特殊的编译器处理。有些人将这个概念扩展到对不可变对象的引用,这些对象没有得到那种特殊的处理,但是不可能将可变对象视为常量。Java约定要求常量来获取大写变量名,有些人将其扩展到不可变对象,但可变对象?坏主意!顺便说一句,这是一个很好的答案,我觉得我还在笑。。。比较哈哈…谢谢你提供的额外信息,我很感激。final和const不是一回事吗?或者我真的应该把它改成大写吗?const在Java中不是一个东西。严格来说,也就是说,根据Java语言规范JLS,常量变量是字符串类型的变量或使用常量表达式初始化的基元类型的变量。它得到特殊的编译器处理。有些人将这个概念扩展到对不可变对象的引用,这些对象没有得到那种特殊的处理,但是不可能将可变对象视为常量。Java约定要求常量来获取大写变量名,有些人将其扩展到不可变对象,但可变对象?坏主意!顺便说一句,这是一个很好的答案,我觉得我还在笑。。。比较哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈。。。。顺便说一句,我不会为未来的读者编辑这个可笑的答案@谢谢你,朋友!你的是从一位专家那里学来的,我从阅读比较中学到了很多东西?@LewBloch Hhahahahahahahahahahahahahafantaaaastic,我没有注意到,我会说西班牙语,我的天。。。。顺便说一句,我不会为未来的读者编辑这个可笑的答案@谢谢你,朋友!你的书是从一位专家那里学来的,我读了很多书。别忘了你可以
n只接受一个答案;别忘了你只能接受一个答案;