【问题标题】:JUnit assertEquals( ) fails for two objects两个对象的 JUnit assertEquals() 失败
【发布时间】:2011-05-19 15:12:42
【问题描述】:

我创建了一个类并覆盖了 equals() 方法。当我使用assertTrue(obj1.equals(obj2))时,它会通过测试;但是,assertEquals(obj1, obj2) 将无法通过测试。有人能说说原因吗?

【问题讨论】:

  • 我们需要看一下equals方法的代码
  • obj1obj2 是否属于同一类型?
  • 您是否尝试过在调试模式下,assertEquals 使用了覆盖的相等?
  • 您能否检查/发布您的 equals 方法语法,很可能您没有覆盖 Object 类中的 equals,而是您必须编写自己的版本。

标签: junit equals


【解决方案1】:

我的猜测是你没有实际上覆盖equals - 你已经重载了它。使用@Override 注解在编译时找出这类东西。

换句话说,我怀疑你有:

public boolean equals(MyClass other)

你应该有的地方:

@Override // Force the compiler to check I'm really overriding something
public boolean equals(Object other)

在您的工作断言中,您无疑将重载方法调用为 obj1obj2 的编译时类型都是 MyClass (或任何您的类被调用)。 JUnit 的assertEquals 只会调用equals(Object),因为它不知道更好。

【讨论】:

  • 当我将 public boolean equals(MyClass other) 更改为 public boolean equals(Object other) 时,它可以工作。谢谢乔恩。
  • @nikel:Date 是可变的这一事实使得很难很好地实现相等 - 你可以有一个 HashSet<Date>,一旦你改变了一个条目,你将无法做到再次找到它...
  • 重新添加评论 - 我想知道为什么 Date 不覆盖它的 equals 实现......
  • 跟进 - 我创建了两个具有相等值(小时、分钟、秒等)的 Date 对象。在它们上调用 Junit 的 assertEquals 会得到 true,但是由于 Date 在其定义中没有说 Override,Junit assertEquals 不应该调用 Object equals 吗?并因此返回 false?
  • @nikel:覆盖注释只是让编译器检查它是否真的覆盖的一种方式。它不是必需的
【解决方案2】:

这是assertEquals 的代码(来自Github):

static public void assertEquals(String message, Object expected,
        Object actual) {
    if (expected == null && actual == null)
        return;
    if (expected != null && isEquals(expected, actual))
        return;
    else if (expected instanceof String && actual instanceof String) {
        String cleanMessage= message == null ? "" : message;
        throw new ComparisonFailure(cleanMessage, (String) expected,
                (String) actual);
    } else
        failNotEquals(message, expected, actual);
}

private static boolean isEquals(Object expected, Object actual) {
    return expected.equals(actual);
}

我只能想到一种情况与您描述的方式相同 - 如果您的 equals 方法未正确处理与 null 值的比较。

【讨论】:

  • 您假设 JUnit 调用的 equals 与传递版本中调用的 equals 相同...
  • @Jon 是的,刚刚注意到你猜对了问题。
【解决方案3】:

正如其他人所提到的,您需要重写 equals() 函数。如果您使用一些 IDE,这会容易得多。例如,在 Eclipse 中,在你的 java 文件中,右键单击 -> 源 -> 生成 hashCode() 和 equals(),就可以了。再次运行测试,现在应该可以通过了。

生成这些方法也是一种很好的做法,因为它们有自己的优势,这将使您的代码更强大,并使其更符合 OOAD 原则。

【讨论】:

    猜你喜欢
    • 2019-03-07
    • 2016-03-06
    • 2015-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-03
    相关资源
    最近更新 更多