View Javadoc
1   package mockit;
2   
3   import static org.junit.jupiter.api.Assertions.assertEquals;
4   import static org.junit.jupiter.api.Assertions.assertNotEquals;
5   import static org.junit.jupiter.api.Assertions.assertTrue;
6   
7   import org.junit.jupiter.api.Test;
8   
9   /**
10   * The Class ObjectOverridesAndInjectableMocksTest.
11   */
12  @SuppressWarnings({ "ObjectEqualsNull", "SimplifiableJUnitAssertion" })
13  final class ObjectOverridesAndInjectableMocksTest {
14  
15      /** The a. */
16      @Injectable
17      ClassWithObjectOverrides a;
18  
19      /** The b. */
20      @Injectable
21      ClassWithObjectOverrides b;
22  
23      /**
24       * Verify standard behavior of overridden equals methods in mocked class.
25       */
26      @Test
27      void verifyStandardBehaviorOfOverriddenEqualsMethodsInMockedClass() {
28          assertDefaultEqualsBehavior(a, b);
29          assertDefaultEqualsBehavior(b, a);
30      }
31  
32      /**
33       * Assert default equals behavior.
34       *
35       * @param obj1
36       *            the obj 1
37       * @param obj2
38       *            the obj 2
39       */
40      void assertDefaultEqualsBehavior(Object obj1, Object obj2) {
41          assertNotEquals(null, obj1);
42          assertNotEquals("test", obj1);
43          // noinspection EqualsWithItself
44          assertEquals(obj1, obj1);
45          assertNotEquals(obj1, obj2);
46      }
47  
48      /**
49       * Allow any invocations on overridden object methods for strict mocks.
50       */
51      @Test
52      void allowAnyInvocationsOnOverriddenObjectMethodsForStrictMocks() {
53          new Expectations() {
54              {
55                  a.getIntValue();
56                  result = 58;
57              }
58          };
59  
60          assertNotEquals(a, b);
61          // noinspection EqualsWithItself
62          assertEquals(a, a);
63          assertEquals(58, a.getIntValue());
64          assertNotEquals(b, a);
65          assertNotEquals(a, b);
66      }
67  
68      /**
69       * The Class BaseClass.
70       */
71      static class BaseClass {
72  
73          /** The value. */
74          final int value;
75  
76          /**
77           * Instantiates a new base class.
78           *
79           * @param value
80           *            the value
81           */
82          BaseClass(int value) {
83              this.value = value;
84          }
85  
86          @Override
87          public boolean equals(Object obj) {
88              return value == ((BaseClass) obj).value;
89          }
90      }
91  
92      /**
93       * The Class Subclass1.
94       */
95      static class Subclass1 extends BaseClass {
96          /**
97           * Instantiates a new subclass 1.
98           */
99          Subclass1() {
100             super(1);
101         }
102     }
103 
104     /**
105      * The Class Subclass2.
106      */
107     static class Subclass2 extends BaseClass {
108         /**
109          * Instantiates a new subclass 2.
110          */
111         Subclass2() {
112             super(2);
113         }
114     }
115 
116     /**
117      * Execute equals override on instances of different subclass than the one mocked.
118      *
119      * @param mocked
120      *            the mocked
121      */
122     @Test
123     void executeEqualsOverrideOnInstancesOfDifferentSubclassThanTheOneMocked(@Injectable Subclass1 mocked) {
124         Object s1 = new Subclass2();
125         Object s2 = new Subclass2();
126 
127         boolean cmp = s1.equals(s2);
128 
129         assertTrue(cmp);
130     }
131 }