Class EqualsTester


  • public class EqualsTester
    extends junit.framework.Assert
    EqualsTester is used to test the equals contract on objects. The contract as specified by java.lang.Object states that if A.equals(B) is true then B.equals(A) is also true. It also specifies that if A.equals(B) is true then A.hashCode() will equals B.hashCode().

    It is also common practice to implement equals using an instanceof check which will result in false positives in some cases. Specifically, it will result in false positives when comparing against a subclass with the same values. For an in-depth discussion of the common problems when implementing the equals contract, refer to the book "Practical Java" by Peter Haggar

     // WRONG way of implementing equals
     public boolean equals( final Object object ) {
         if( object instanceof this ) {
            // do check
         }
         return false;
     }
     
    The correct way to implement equals is as follows
     public boolean equals( final Object object ) {
         if( object != null && object.getClass() == this.getClass() ) {
            // do check
         }
         return false;
     }
     
    EqualsTester ensures that the equals() and hashCode() methods have been implemented correctly.

     final Object a = new Foo(4); // original object
     final Object b = new Foo(4); // another object that has the same values as the original
     final Object c = new Foo(5); // another object with different values
     final Object d = new Foo(4) {}; // a subclass of Foo with the same values as the original
     new EqualsTester(a, b, c, d);
     
    Version:
    $Revision: 1.4 $
    • Constructor Summary

      Constructors 
      Constructor Description
      EqualsTester​(java.lang.Object a, java.lang.Object b, java.lang.Object c, java.lang.Object d)
      Perform the test.
    • Method Summary

      All Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      private void assertAEqualsA​(java.lang.Object a)  
      private void assertAEqualsB​(java.lang.Object a, java.lang.Object b)  
      private void assertAEqualsNull​(java.lang.Object a)  
      private void assertANotEqualC​(java.lang.Object a, java.lang.Object c)  
      private void assertCAllowedToBeNull​(java.lang.Class clazz)
      C may not be null if it has a public non-default constructor or any setXX() methods
      private void assertClassAndSubclass​(java.lang.Object a, java.lang.Object d)  
      private void assertDDifferentClassThanA​(java.lang.Object a, java.lang.Object d)  
      private void assertNotNull​(java.lang.Object object, java.lang.String description)  
      private void assertNull​(java.lang.Object object, java.lang.String description)  
      private void assertSameClassAsA​(java.lang.Object a, java.lang.Object object, java.lang.String name)  
      private boolean isClassFinal​(java.lang.Class clazz)  
      • Methods inherited from class junit.framework.Assert

        assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertEquals, assertFalse, assertFalse, assertNotNull, assertNotNull, assertNotSame, assertNotSame, assertNull, assertNull, assertSame, assertSame, assertTrue, assertTrue, fail, fail, failNotEquals, failNotSame, failSame, format
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Constructor Detail

      • EqualsTester

        public EqualsTester​(java.lang.Object a,
                            java.lang.Object b,
                            java.lang.Object c,
                            java.lang.Object d)
        Perform the test. The act of instantiating one of these will run the test.
        Parameters:
        a - The object to be tested
        b - An object that is equal to A
        c - An object of the same class that is not equal to A. If it is not possible to create a different one then pass null.
        d - A subclass of A with the same values. If A is an instance of a final class then this must be null
    • Method Detail

      • isClassFinal

        private boolean isClassFinal​(java.lang.Class clazz)
      • assertAEqualsA

        private void assertAEqualsA​(java.lang.Object a)
      • assertAEqualsB

        private void assertAEqualsB​(java.lang.Object a,
                                    java.lang.Object b)
      • assertANotEqualC

        private void assertANotEqualC​(java.lang.Object a,
                                      java.lang.Object c)
      • assertClassAndSubclass

        private void assertClassAndSubclass​(java.lang.Object a,
                                            java.lang.Object d)
      • assertNotNull

        private void assertNotNull​(java.lang.Object object,
                                   java.lang.String description)
      • assertNull

        private void assertNull​(java.lang.Object object,
                                java.lang.String description)
      • assertCAllowedToBeNull

        private void assertCAllowedToBeNull​(java.lang.Class clazz)
        C may not be null if it has a public non-default constructor or any setXX() methods
        Parameters:
        clazz -
      • assertSameClassAsA

        private void assertSameClassAsA​(java.lang.Object a,
                                        java.lang.Object object,
                                        java.lang.String name)
      • assertDDifferentClassThanA

        private void assertDDifferentClassThanA​(java.lang.Object a,
                                                java.lang.Object d)
      • assertAEqualsNull

        private void assertAEqualsNull​(java.lang.Object a)