1
2
3
4
5
6 package mockit;
7
8 import static org.junit.jupiter.api.Assertions.assertEquals;
9 import static org.junit.jupiter.api.Assertions.assertTrue;
10
11 import jakarta.annotation.PostConstruct;
12 import jakarta.annotation.PreDestroy;
13
14 import java.util.Observable;
15
16 import mockit.integration.junit5.JMockitExtension;
17
18 import org.junit.jupiter.api.AfterEach;
19 import org.junit.jupiter.api.BeforeEach;
20 import org.junit.jupiter.api.Test;
21 import org.junit.jupiter.api.extension.ExtendWith;
22
23
24
25
26 @ExtendWith(JMockitExtension.class)
27 class TestedClassWithConstructorDI1Test {
28
29
30
31
32 public static class BaseTestedClass {
33
34
35 static int baseCounter;
36
37
38
39
40 @PostConstruct
41 void initializeBase() {
42 baseCounter++;
43 }
44
45
46
47
48 @PreDestroy
49 void destroyBase() {
50 baseCounter++;
51 }
52 }
53
54
55
56
57 public static final class TestedClass extends BaseTestedClass {
58
59
60 static int counter;
61
62
63 private final Dependency dependency;
64
65
66 private final Runnable runnable;
67
68
69 private final Observable observable;
70
71
72
73
74
75
76
77 public TestedClass(Dependency dependency) {
78 this(dependency, null, null);
79 }
80
81
82
83
84
85
86
87
88
89 public TestedClass(Dependency dependency, Runnable runnable) {
90 this(dependency, runnable, null);
91 }
92
93
94
95
96
97
98
99
100
101 public TestedClass(Dependency dependency, Observable observable) {
102 this(dependency, null, observable);
103 }
104
105
106
107
108
109
110
111
112
113
114
115 public TestedClass(Dependency dependency, Runnable runnable, Observable observable) {
116 this.dependency = dependency;
117 this.runnable = runnable;
118 this.observable = observable;
119 }
120
121
122
123
124
125
126 public boolean doSomeOperation() {
127 if (runnable != null) {
128 runnable.run();
129 }
130
131 boolean b = dependency.doSomething() > 0;
132
133 if (b && observable != null) {
134 observable.notifyObservers();
135 }
136
137 return b;
138 }
139
140
141
142
143 @PostConstruct
144 void initialize() {
145 counter++;
146 }
147
148
149
150
151 @PreDestroy
152 void destroy() {
153 counter++;
154 }
155 }
156
157
158
159
160 static class Dependency {
161
162
163
164
165
166 int doSomething() {
167 return -1;
168 }
169 }
170
171
172 @Tested
173 TestedClass tested;
174
175
176 @Injectable
177 Dependency mock;
178
179
180
181
182 @Test
183 void exerciseTestedObjectWithSingleDependencyInjectedThroughConstructor() {
184 assertTestedObjectWasInitialized();
185
186 new Expectations() {
187 {
188 mock.doSomething();
189 result = 23;
190 }
191 };
192
193 assertTrue(tested.doSomeOperation());
194 }
195
196
197
198
199
200
201
202 @Test
203 void exerciseTestedObjectWithTwoDependenciesInjectedThroughConstructor(@Injectable final Runnable mock2) {
204 assertTestedObjectWasInitialized();
205
206 new Expectations() {
207 {
208 mock.doSomething();
209 result = 23;
210 }
211 };
212
213 assertTrue(tested.doSomeOperation());
214
215 new Verifications() {
216 {
217 mock2.run();
218 }
219 };
220 }
221
222
223
224
225
226
227
228 @Test
229 void exerciseTestedObjectWithTwoOtherDependenciesInjectedThroughConstructor(@Injectable final Observable obs) {
230 assertTestedObjectWasInitialized();
231
232 new Expectations() {
233 {
234 mock.doSomething();
235 result = 123;
236 }
237 };
238
239 assertTrue(tested.doSomeOperation());
240
241 new FullVerifications() {
242 {
243 obs.notifyObservers();
244 }
245 };
246 }
247
248
249
250
251
252
253
254
255
256 @Test
257 void exerciseTestedObjectWithAllDependenciesInjectedThroughConstructor(@Injectable final Runnable mock2,
258 @Injectable final Observable mock3) {
259 assertTestedObjectWasInitialized();
260
261 new Expectations() {
262 {
263 mock.doSomething();
264 result = 123;
265 }
266 };
267
268 assertTrue(tested.doSomeOperation());
269
270 new VerificationsInOrder() {
271 {
272 mock2.run();
273 mock3.notifyObservers();
274 }
275 };
276 }
277
278
279
280
281 @BeforeEach
282 void resetCounter() {
283 BaseTestedClass.baseCounter = 0;
284 TestedClass.counter = 0;
285 }
286
287
288
289
290 void assertTestedObjectWasInitialized() {
291 assertEquals(1, BaseTestedClass.baseCounter);
292 assertEquals(1, TestedClass.counter);
293 }
294
295
296
297
298 @AfterEach
299 void verifyTestedObjectAfterEveryTest() {
300 assertEquals(2, BaseTestedClass.baseCounter);
301 assertEquals(2, TestedClass.counter);
302 }
303 }