【问题标题】:junit AssertionFailedError with memory address [duplicate]带有内存地址的junit AssertionFailedError [重复]
【发布时间】:2017-11-12 02:00:19
【问题描述】:

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

【问题讨论】:

  • 别忘了你只能接受一个答案 ;)

标签: java junit


【解决方案1】:

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

http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#toString-- “类 Object 的 toString 方法返回一个字符串,该字符串由对象作为实例的类的名称、at-sign 字符‘@’和对象哈希码的无符号十六进制表示形式组成。”

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

您的测试方法未返回预期值。那是因为您有两个不同的数组,并且数组仅在标识上相等,而不是内容。因此,除非它们是完全相同的数组对象,否则它们不能相等。您需要断言数组 contents 比较相等。

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

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

【讨论】:

  • 感谢您提供的额外信息,非常感谢。 finalconst 不是一回事吗,还是我真的应该全部改成大写?
  • const 在 Java 中不是一个东西。严格来说,即根据Java语言规范(JLS),常量变量String类型的变量,或者是用常量表达式初始化的原始类型我>。它得到特殊的编译器处理。有些人将此概念扩展到对不可变对象的引用,这些对象没有得到特殊处理,但可变对象不能被认为是常量。 Java 约定要求常量来获取大写变量名,有些人将其扩展到不可变对象,但是可变对象呢?坏主意!
  • 顺便说一句很棒的答案:),在我看来是一个加分项
  • 我还在笑……对比哈哈哈哈……
【解决方案2】:

使用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 );
}

【讨论】:

  • “比较”?
  • @LewBloch hhahahahahahaahhahahahhaah fantaaaastic,我没注意到,我会说西班牙语,我的上帝....我不会编辑让未来的读者可以笑
  • 顺便说一句,答案很棒。 :)
  • @LewBloch 谢谢朋友!你的来自专家,我学到了很多阅读
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-08
  • 2011-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-18
  • 1970-01-01
相关资源
最近更新 更多