junit assertEquals(Object o1,Object o2)是否使用equals方法

1l5u6lss  于 2023-11-19  发布在  其他
关注(0)|答案(8)|浏览(113)

换句话说,assertEquals是否适用于重写equals的类

xa9qqrwz

xa9qqrwz1#

source code of the assertEquals method中,您可以在Junit GitHub Repo上找到:

/**
 * Asserts that two objects are equal. If they are not
 * an AssertionFailedError is thrown with the given message.
 */
static public void assertEquals(String message, Object expected, Object actual) {
    if (expected == null && actual == null) {
        return;
    }
    if (expected != null && expected.equals(actual)) {
        return;
    }
    failNotEquals(message, expected, actual);
}

字符串
您可以看到Junit正在使用.equals()方法。

编辑:

代码片段来自Junit的一个弃用版本。
您可以阅读有关'新' Junit here的源代码。其思想几乎相同,也使用了.equals()方法。

kjthegm6

kjthegm62#

assertEquals是否适用于重写equals的类?
是的,assertEquals()调用重写的equals()(如果类有)。

gcuhipw9

gcuhipw93#

是的,它调用了equals,还有一个单独的方法assertSame,它使用了==。只是为了澄清一下,assertEquals适用于 * 任何 * 对象,因为所有对象都声明了equals

i86rm4rw

i86rm4rw4#

是的。

Object m = new Object() {

    @Override
    public boolean equals(Object obj) {
        System.out.println("proof!");
        return super.equals(obj);
    }
};
Assert.assertEquals(m, m);

字符串

h4cxqtbf

h4cxqtbf5#

是- TestNG覆盖等于-

static public void assertEquals(Object actual, Object expected, String message) {
    if((expected == null) && (actual == null)) {
      return;
    }
    if(expected != null) {
      if (expected.getClass().isArray()) {
        assertArrayEquals(actual, expected, message);
        return;
      } else if (expected.equals(actual)) {
        return;
      }
    }
    failNotEquals(actual, expected, message);
  }

字符串

shyt4zoc

shyt4zoc6#

JUnit是开源的,因此您可以自己在源代码中查找它:https://github.com/junit-team/junit4/blob/master/src/main/java/org/junit/Assert.java

static public void assertEquals(String message, Object expected,
        Object actual) {
    if (equalsRegardingNull(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 equalsRegardingNull(Object expected, Object actual) {
    if (expected == null) {
        return actual == null;
    }

    return isEquals(expected, actual);
}

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

字符串
如你所见,它使用equals,如果你想比较恒等式,你可以使用assertSame

elcex8rz

elcex8rz7#

一般来说,答案是肯定的,但是除非文档明确指定了Assert方法的行为,否则您不应该假设在所有情况下都调用equals。例如,当expected == actualactual == null时,Assert方法可能会快速返回,而根本不调用equals
JUnit 5的Assertions class明确地提到了这一点:
比较两个对象是否相等的Assert方法,例如assertEquals(expected, actual)assertNotEquals(unexpected, actual)变体,只是为了测试(非)预期值和实际值是否相等。它们不是为了测试类是否正确实现Object.equals(Object)而设计的。例如,assertEquals()在为期望值和实际值提供相同的对象时可能立即返回true,而不调用equals(Object)。旨在验证equals(Object)实现的测试应该改为使用assertTrue()assertFalse()-例如,assertTrue(expected.equals(actual))assertTrue(actual.equals(expected))assertFalse(expected.equals(null))等。

lfapxunr

lfapxunr8#

我在集成测试中使用chai assert,它有一个deepEqual,可以做OP想要的事情。

const assert = require("chai").assert;

字符串
...

assert.deepEqual(arrayOfObjectsFromApiCall, dummyTestArrayOfObjects)

相关问题