Does assertEquals(Object o1, Object o2) uses the equals method

后端 未结 6 1755
孤街浪徒
孤街浪徒 2020-12-05 04:15

In other words, does assertEquals works with a class that overrides equals

相关标签:
6条回答
  • 2020-12-05 04:18

    yes - TestNG overrides equals -

    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);
      }
    
    0 讨论(0)
  • 2020-12-05 04:20

    Yes it does.

    Object m = new Object() {
    
        @Override
        public boolean equals(Object obj) {
            System.out.println("proof!");
            return super.equals(obj);
        }
    };
    Assert.assertEquals(m, m);
    
    0 讨论(0)
  • 2020-12-05 04:28

    From the source code of the assertEquals method that you can find on the 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);
    }
    

    You can see that Junit is using the .equals() method.

    Edit:

    The code snippet is coming from a deprecated version of Junit.

    You can read about the source of the 'new' Junit here. The idea is pretty much the same, the .equals() method is also used.

    0 讨论(0)
  • 2020-12-05 04:37

    Yes, it calls equals and there is a separate method, assertSame, that uses ==. Just to clear things up, assertEquals works with any object since all objects declare equals.

    0 讨论(0)
  • 2020-12-05 04:39

    does assertEquals works with a class that overrides equals?

    Yes, assertEquals() invokes the overridden equals() if the class has one.

    0 讨论(0)
  • 2020-12-05 04:45

    JUnit is opensource, so you could have looked it up yourself in the source: 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);
    }
    

    So as you can see it uses equals. If you want to compare identity, you use assertSame.

    0 讨论(0)
提交回复
热议问题