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