17
17
package org .springframework .test .context .aot ;
18
18
19
19
import java .lang .annotation .Annotation ;
20
+ import java .lang .reflect .Proxy ;
20
21
import java .util .ArrayList ;
21
22
import java .util .List ;
22
23
import java .util .Set ;
23
24
import java .util .stream .Stream ;
24
25
25
26
import javax .sql .DataSource ;
26
27
28
+ import org .assertj .core .util .Arrays ;
29
+ import org .easymock .EasyMockSupport ;
27
30
import org .junit .jupiter .api .Test ;
31
+ import org .mockito .Mockito ;
28
32
29
33
import org .springframework .aot .AotDetector ;
30
34
import org .springframework .aot .generate .DefaultGenerationContext ;
37
41
import org .springframework .context .ApplicationContext ;
38
42
import org .springframework .context .ApplicationContextInitializer ;
39
43
import org .springframework .context .ConfigurableApplicationContext ;
44
+ import org .springframework .context .aot .AbstractAotProcessor ;
40
45
import org .springframework .core .test .tools .CompileWithForkedClassLoader ;
41
46
import org .springframework .core .test .tools .TestCompiler ;
42
47
import org .springframework .javapoet .ClassName ;
47
52
import org .springframework .test .context .aot .samples .basic .BasicSpringJupiterTests ;
48
53
import org .springframework .test .context .aot .samples .basic .BasicSpringTestNGTests ;
49
54
import org .springframework .test .context .aot .samples .basic .BasicSpringVintageTests ;
55
+ import org .springframework .test .context .aot .samples .bean .override .EasyMockBeanJupiterTests ;
56
+ import org .springframework .test .context .aot .samples .bean .override .MockitoBeanJupiterTests ;
57
+ import org .springframework .test .context .aot .samples .common .GreetingService ;
50
58
import org .springframework .test .context .aot .samples .common .MessageService ;
51
59
import org .springframework .test .context .aot .samples .jdbc .SqlScriptsSpringJupiterTests ;
52
60
import org .springframework .test .context .aot .samples .web .WebSpringJupiterTests ;
67
75
import static org .springframework .aot .hint .MemberCategory .INVOKE_DECLARED_METHODS ;
68
76
import static org .springframework .aot .hint .MemberCategory .INVOKE_PUBLIC_CONSTRUCTORS ;
69
77
import static org .springframework .aot .hint .MemberCategory .INVOKE_PUBLIC_METHODS ;
78
+ import static org .springframework .aot .hint .predicate .RuntimeHintsPredicates .proxies ;
70
79
import static org .springframework .aot .hint .predicate .RuntimeHintsPredicates .reflection ;
71
80
import static org .springframework .aot .hint .predicate .RuntimeHintsPredicates .resource ;
72
81
import static org .springframework .test .web .servlet .request .MockMvcRequestBuilders .get ;
@@ -97,14 +106,25 @@ void endToEndTests() {
97
106
BasicSpringJupiterTests .NestedTests .class ,
98
107
BasicSpringTestNGTests .class ,
99
108
BasicSpringVintageTests .class ,
109
+ EasyMockBeanJupiterTests .class ,
110
+ MockitoBeanJupiterTests .class ,
100
111
SqlScriptsSpringJupiterTests .class ,
101
112
XmlSpringJupiterTests .class ,
102
113
WebSpringJupiterTests .class );
103
114
104
115
InMemoryGeneratedFiles generatedFiles = new InMemoryGeneratedFiles ();
105
116
TestContextAotGenerator generator = new TestContextAotGenerator (generatedFiles );
106
117
107
- generator .processAheadOfTime (testClasses .stream ().sorted (comparing (Class ::getName )));
118
+ try {
119
+ // Emulate AbstractAotProcessor.process().
120
+ System .setProperty (AbstractAotProcessor .AOT_PROCESSING , "true" );
121
+
122
+ generator .processAheadOfTime (testClasses .stream ().sorted (comparing (Class ::getName )));
123
+ }
124
+ finally {
125
+ // Emulate AbstractAotProcessor.process().
126
+ System .clearProperty (AbstractAotProcessor .AOT_PROCESSING );
127
+ }
108
128
109
129
assertRuntimeHints (generator .getRuntimeHints ());
110
130
@@ -142,6 +162,12 @@ void endToEndTests() {
142
162
else if (testClass .getPackageName ().contains ("jdbc" )) {
143
163
assertContextForJdbcTests (context );
144
164
}
165
+ else if (testClass .equals (EasyMockBeanJupiterTests .class )) {
166
+ assertContextForEasyMockBeanOverrideTests (context );
167
+ }
168
+ else if (testClass .equals (MockitoBeanJupiterTests .class )) {
169
+ assertContextForMockitoBeanOverrideTests (context );
170
+ }
145
171
else {
146
172
assertContextForBasicTests (context );
147
173
}
@@ -243,6 +269,15 @@ private static void assertRuntimeHints(RuntimeHints runtimeHints) {
243
269
.accepts (runtimeHints );
244
270
assertThat (resource ().forResource ("org/springframework/test/context/aot/samples/jdbc/SqlScriptsSpringJupiterTests.test.sql" ))
245
271
.accepts (runtimeHints );
272
+
273
+ // @BeanOverride(value = ...)
274
+ assertReflectionRegistered (runtimeHints , "org.springframework.test.context.bean.override.mockito.MockitoBeanOverrideProcessor" ,
275
+ INVOKE_DECLARED_CONSTRUCTORS );
276
+
277
+ // GenericApplicationContext.preDetermineBeanTypes() should have registered proxy
278
+ // hints for the EasyMock interface-based mocks.
279
+ assertProxyRegistered (runtimeHints , GreetingService .class );
280
+ assertProxyRegistered (runtimeHints , MessageService .class );
246
281
}
247
282
248
283
private static void assertReflectionRegistered (RuntimeHints runtimeHints , String type ) {
@@ -267,6 +302,13 @@ private static void assertAnnotationRegistered(RuntimeHints runtimeHints, Class<
267
302
assertReflectionRegistered (runtimeHints , annotationType , INVOKE_DECLARED_METHODS );
268
303
}
269
304
305
+ private static void assertProxyRegistered (RuntimeHints runtimeHints , Class <?>... interfaces ) {
306
+ assertThat (proxies ().forInterfaces (interfaces ))
307
+ .as ("Proxy hint for %s" , Arrays .asList (interfaces ))
308
+ .accepts (runtimeHints );
309
+ }
310
+
311
+
270
312
271
313
@ Test
272
314
void processAheadOfTimeWithBasicTests () {
@@ -297,6 +339,24 @@ private void assertContextForJdbcTests(ApplicationContext context) {
297
339
assertThat (context .getBean (DataSource .class )).as ("DataSource" ).isNotNull ();
298
340
}
299
341
342
+ private void assertContextForEasyMockBeanOverrideTests (ApplicationContext context ) {
343
+ GreetingService greetingService = context .getBean (GreetingService .class );
344
+ MessageService messageService = context .getBean (MessageService .class );
345
+
346
+ assertThat (EasyMockSupport .isAMock (greetingService )).as ("EasyMock mock" ).isTrue ();
347
+ assertThat (EasyMockSupport .isAMock (messageService )).as ("EasyMock mock" ).isTrue ();
348
+ assertThat (Proxy .isProxyClass (greetingService .getClass ())).as ("JDK proxy" ).isTrue ();
349
+ assertThat (Proxy .isProxyClass (messageService .getClass ())).as ("JDK proxy" ).isTrue ();
350
+ }
351
+
352
+ private void assertContextForMockitoBeanOverrideTests (ApplicationContext context ) {
353
+ GreetingService greetingService = context .getBean (GreetingService .class );
354
+ MessageService messageService = context .getBean (MessageService .class );
355
+
356
+ assertThat (Mockito .mockingDetails (greetingService ).isMock ()).as ("Mockito mock" ).isTrue ();
357
+ assertThat (Mockito .mockingDetails (messageService ).isMock ()).as ("Mockito mock" ).isTrue ();
358
+ }
359
+
300
360
private void assertContextForWebTests (WebApplicationContext wac ) throws Exception {
301
361
assertThat (wac .getEnvironment ().getProperty ("test.engine" )).as ("Environment" ).isNotNull ();
302
362
@@ -364,10 +424,19 @@ private List<Mapping> processAheadOfTime(TestContextAotGenerator generator, Set<
364
424
testClasses .forEach (testClass -> {
365
425
DefaultGenerationContext generationContext = generator .createGenerationContext (testClass );
366
426
MergedContextConfiguration mergedConfig = buildMergedContextConfiguration (testClass );
367
- ClassName className = generator .processAheadOfTime (mergedConfig , generationContext );
368
- assertThat (className ).isNotNull ();
369
- mappings .add (new Mapping (mergedConfig , className ));
370
- generationContext .writeGeneratedContent ();
427
+ try {
428
+ // Emulate AbstractAotProcessor.process().
429
+ System .setProperty (AbstractAotProcessor .AOT_PROCESSING , "true" );
430
+
431
+ ClassName className = generator .processAheadOfTime (mergedConfig , generationContext );
432
+ assertThat (className ).isNotNull ();
433
+ mappings .add (new Mapping (mergedConfig , className ));
434
+ generationContext .writeGeneratedContent ();
435
+ }
436
+ finally {
437
+ // Emulate AbstractAotProcessor.process().
438
+ System .clearProperty (AbstractAotProcessor .AOT_PROCESSING );
439
+ }
371
440
});
372
441
return mappings ;
373
442
}
@@ -422,29 +491,43 @@ record Mapping(MergedContextConfiguration mergedConfig, ClassName className) {
422
491
"org/springframework/test/context/aot/samples/basic/BasicSpringVintageTests__TestContext004_BeanFactoryRegistrations.java" ,
423
492
"org/springframework/test/context/aot/samples/basic/BasicTestConfiguration__TestContext004_BeanDefinitions.java" ,
424
493
"org/springframework/test/context/support/DynamicPropertyRegistrarBeanInitializer__TestContext004_BeanDefinitions.java" ,
425
- // SqlScriptsSpringJupiterTests
494
+ // EasyMockBeanJupiterTests
426
495
"org/springframework/context/event/DefaultEventListenerFactory__TestContext005_BeanDefinitions.java" ,
427
496
"org/springframework/context/event/EventListenerMethodProcessor__TestContext005_BeanDefinitions.java" ,
428
- "org/springframework/test/context/aot/samples/jdbc/SqlScriptsSpringJupiterTests__TestContext005_ApplicationContextInitializer .java" ,
429
- "org/springframework/test/context/aot/samples/jdbc/SqlScriptsSpringJupiterTests__TestContext005_BeanFactoryRegistrations .java" ,
430
- "org/springframework/test/context/jdbc/EmptyDatabaseConfig__TestContext005_BeanDefinitions .java" ,
497
+ "org/springframework/test/context/aot/samples/bean/override/EasyMockBeanJupiterTests__TestContext005_ApplicationContextInitializer .java" ,
498
+ "org/springframework/test/context/aot/samples/bean/override/EasyMockBeanJupiterTests__TestContext005_BeanDefinitions .java" ,
499
+ "org/springframework/test/context/aot/samples/bean/override/EasyMockBeanJupiterTests__TestContext005_BeanFactoryRegistrations .java" ,
431
500
"org/springframework/test/context/support/DynamicPropertyRegistrarBeanInitializer__TestContext005_BeanDefinitions.java" ,
432
- // WebSpringJupiterTests
501
+ // MockitoBeanJupiterTests
433
502
"org/springframework/context/event/DefaultEventListenerFactory__TestContext006_BeanDefinitions.java" ,
434
503
"org/springframework/context/event/EventListenerMethodProcessor__TestContext006_BeanDefinitions.java" ,
435
- "org/springframework/test/context/aot/samples/web/WebSpringJupiterTests__TestContext006_ApplicationContextInitializer.java" ,
436
- "org/springframework/test/context/aot/samples/web/WebSpringJupiterTests__TestContext006_BeanFactoryRegistrations.java" ,
437
- "org/springframework/test/context/aot/samples/web/WebTestConfiguration__TestContext006_BeanDefinitions.java" ,
438
- "org/springframework/web/servlet/config/annotation/DelegatingWebMvcConfiguration__TestContext006_Autowiring.java" ,
439
- "org/springframework/web/servlet/config/annotation/DelegatingWebMvcConfiguration__TestContext006_BeanDefinitions.java" ,
504
+ "org/springframework/test/context/aot/samples/bean/override/MockitoBeanJupiterTests__TestContext006_ApplicationContextInitializer.java" ,
505
+ "org/springframework/test/context/aot/samples/bean/override/MockitoBeanJupiterTests__TestContext006_BeanDefinitions.java" ,
506
+ "org/springframework/test/context/aot/samples/bean/override/MockitoBeanJupiterTests__TestContext006_BeanFactoryRegistrations.java" ,
440
507
"org/springframework/test/context/support/DynamicPropertyRegistrarBeanInitializer__TestContext006_BeanDefinitions.java" ,
441
- // XmlSpringJupiterTests
508
+ // SqlScriptsSpringJupiterTests
442
509
"org/springframework/context/event/DefaultEventListenerFactory__TestContext007_BeanDefinitions.java" ,
443
510
"org/springframework/context/event/EventListenerMethodProcessor__TestContext007_BeanDefinitions.java" ,
444
- "org/springframework/test/context/aot/samples/common/DefaultMessageService__TestContext007_BeanDefinitions .java" ,
445
- "org/springframework/test/context/aot/samples/xml/XmlSpringJupiterTests__TestContext007_ApplicationContextInitializer .java" ,
446
- "org/springframework/test/context/aot/samples/xml/XmlSpringJupiterTests__TestContext007_BeanFactoryRegistrations .java" ,
511
+ "org/springframework/test/context/aot/samples/jdbc/SqlScriptsSpringJupiterTests__TestContext007_ApplicationContextInitializer .java" ,
512
+ "org/springframework/test/context/aot/samples/jdbc/SqlScriptsSpringJupiterTests__TestContext007_BeanFactoryRegistrations .java" ,
513
+ "org/springframework/test/context/jdbc/EmptyDatabaseConfig__TestContext007_BeanDefinitions .java" ,
447
514
"org/springframework/test/context/support/DynamicPropertyRegistrarBeanInitializer__TestContext007_BeanDefinitions.java" ,
515
+ // WebSpringJupiterTests
516
+ "org/springframework/context/event/DefaultEventListenerFactory__TestContext008_BeanDefinitions.java" ,
517
+ "org/springframework/context/event/EventListenerMethodProcessor__TestContext008_BeanDefinitions.java" ,
518
+ "org/springframework/test/context/aot/samples/web/WebSpringJupiterTests__TestContext008_ApplicationContextInitializer.java" ,
519
+ "org/springframework/test/context/aot/samples/web/WebSpringJupiterTests__TestContext008_BeanFactoryRegistrations.java" ,
520
+ "org/springframework/test/context/aot/samples/web/WebTestConfiguration__TestContext008_BeanDefinitions.java" ,
521
+ "org/springframework/test/context/support/DynamicPropertyRegistrarBeanInitializer__TestContext008_BeanDefinitions.java" ,
522
+ "org/springframework/web/servlet/config/annotation/DelegatingWebMvcConfiguration__TestContext008_Autowiring.java" ,
523
+ "org/springframework/web/servlet/config/annotation/DelegatingWebMvcConfiguration__TestContext008_BeanDefinitions.java" ,
524
+ // XmlSpringJupiterTests
525
+ "org/springframework/context/event/DefaultEventListenerFactory__TestContext009_BeanDefinitions.java" ,
526
+ "org/springframework/context/event/EventListenerMethodProcessor__TestContext009_BeanDefinitions.java" ,
527
+ "org/springframework/test/context/aot/samples/common/DefaultMessageService__TestContext009_BeanDefinitions.java" ,
528
+ "org/springframework/test/context/aot/samples/xml/XmlSpringJupiterTests__TestContext009_ApplicationContextInitializer.java" ,
529
+ "org/springframework/test/context/aot/samples/xml/XmlSpringJupiterTests__TestContext009_BeanFactoryRegistrations.java" ,
530
+ "org/springframework/test/context/support/DynamicPropertyRegistrarBeanInitializer__TestContext009_BeanDefinitions.java" ,
448
531
};
449
532
450
533
}
0 commit comments