1111import static org .hibernate .testing .bytecode .enhancement .extension .engine .BytecodeEnhancedClassUtils .enhanceTestClass ;
1212import static org .junit .platform .commons .util .AnnotationUtils .findAnnotation ;
1313
14+ import java .lang .reflect .Constructor ;
15+ import java .lang .reflect .InvocationHandler ;
16+ import java .lang .reflect .InvocationTargetException ;
1417import java .lang .reflect .Method ;
18+ import java .lang .reflect .Proxy ;
1519import java .util .Arrays ;
1620import java .util .HashSet ;
1721import java .util .List ;
1822import java .util .Map ;
1923import java .util .Objects ;
2024import java .util .Optional ;
2125import java .util .Set ;
22- import java .util .function .Function ;
23- import java .util .function .Predicate ;
24- import java .util .function .Supplier ;
2526
2627import org .hibernate .testing .bytecode .enhancement .extension .BytecodeEnhanced ;
27- import org .hibernate .testing .junit4 .BaseUnitTestCase ;
2828import org .junit .jupiter .api .Assertions ;
29- import org .junit .jupiter .api .ClassOrderer ;
3029import org .junit .jupiter .api .DisplayNameGenerator ;
31- import org .junit .jupiter .api .MethodOrderer ;
32- import org .junit .jupiter .api .TestInstance ;
33- import org .junit .jupiter .api .extension .ExecutionCondition ;
3430import org .junit .jupiter .api .extension .ExtensionContext ;
35- import org .junit .jupiter .api .io .CleanupMode ;
36- import org .junit .jupiter .api .io .TempDirFactory ;
37- import org .junit .jupiter .api .parallel .ExecutionMode ;
3831import org .junit .jupiter .engine .JupiterTestEngine ;
3932import org .junit .jupiter .engine .config .JupiterConfiguration ;
4033import org .junit .jupiter .engine .descriptor .ClassBasedTestDescriptor ;
4437import org .junit .jupiter .engine .descriptor .TestTemplateTestDescriptor ;
4538import org .junit .jupiter .engine .execution .JupiterEngineExecutionContext ;
4639import org .junit .platform .engine .EngineDiscoveryRequest ;
40+ import org .junit .platform .engine .EngineExecutionListener ;
4741import org .junit .platform .engine .ExecutionRequest ;
4842import org .junit .platform .engine .TestDescriptor ;
4943import org .junit .platform .engine .UniqueId ;
@@ -143,9 +137,13 @@ private void replaceWithEnhanced(Class<?> enhanced, ClassBasedTestDescriptor des
143137 Set <? extends TestDescriptor > children , TestDescriptor parent , String [] testEnhancedClasses ,
144138 Object enhancementContextId )
145139 throws NoSuchMethodException {
146- DelegatingJupiterConfiguration configuration = new DelegatingJupiterConfiguration ( jc , enhancementContextId );
140+ final JupiterConfiguration configuration = (JupiterConfiguration ) Proxy .newProxyInstance (
141+ BytecodeEnhancedTestEngine .class .getClassLoader (),
142+ new Class [] { JupiterConfiguration .class },
143+ new JupiterConfigurationInvocationHandler ( jc , enhancementContextId )
144+ );
147145
148- ClassTestDescriptor updated = new ClassTestDescriptor (
146+ final ClassTestDescriptor updated = new ClassTestDescriptor (
149147 convertUniqueId ( descriptor .getUniqueId (), enhancementContextId ),
150148 enhanced ,
151149 configuration
@@ -210,6 +208,24 @@ private Method findMethodReplacement(ClassTestDescriptor updated, Method testMet
210208
211209 @ Override
212210 protected JupiterEngineExecutionContext createExecutionContext (ExecutionRequest request ) {
211+ try {
212+ // Try constructing the JupiterEngineExecutionContext the way it is done in 5.13+
213+ final Class <?> storeFacadeClass =
214+ Class .forName ( "org.junit.jupiter.engine.descriptor.LauncherStoreFacade" );
215+ final Method getStore = ExecutionRequest .class .getMethod ( "getStore" );
216+ final Constructor <?> storeConstructor = storeFacadeClass .getConstructor ( getStore .getReturnType () );
217+ final Constructor <JupiterEngineExecutionContext > constructor = JupiterEngineExecutionContext .class
218+ .getConstructor ( EngineExecutionListener .class , JupiterConfiguration .class , storeFacadeClass );
219+ return constructor .newInstance (
220+ request .getEngineExecutionListener (),
221+ this .getJupiterConfiguration ( request ),
222+ storeConstructor .newInstance ( getStore .invoke ( request ) )
223+ );
224+ }
225+ catch (ClassNotFoundException | NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException e ) {
226+ // Ignore errors as they are probably due to version mismatches and try the 5.12 way
227+ }
228+
213229 return new JupiterEngineExecutionContext (
214230 request .getEngineExecutionListener (),
215231 this .getJupiterConfiguration ( request )
@@ -237,111 +253,51 @@ public Context(ExecutionRequest request) {
237253 }
238254 }
239255
240- private static class DelegatingJupiterConfiguration implements JupiterConfiguration {
256+ private static class JupiterConfigurationInvocationHandler implements InvocationHandler {
241257 private final JupiterConfiguration configuration ;
242- private final DelegatingDisplayNameGenerator displayNameGenerator ;
258+ private final DisplayNameGenerator displayNameGenerator ;
243259
244- private DelegatingJupiterConfiguration (JupiterConfiguration configuration , Object id ) {
260+ private JupiterConfigurationInvocationHandler (JupiterConfiguration configuration , Object id ) {
245261 this .configuration = configuration ;
246- displayNameGenerator = new DelegatingDisplayNameGenerator (
247- configuration .getDefaultDisplayNameGenerator (),
248- id
262+ displayNameGenerator = (DisplayNameGenerator ) Proxy .newProxyInstance (
263+ BytecodeEnhancedTestEngine .class .getClassLoader (),
264+ new Class []{ DisplayNameGenerator .class },
265+ new DisplayNameGeneratorInvocationHandler ( configuration .getDefaultDisplayNameGenerator (), id )
249266 );
250267 }
251268
252269 @ Override
253- public Optional <String > getRawConfigurationParameter (String s ) {
254- return configuration .getRawConfigurationParameter ( s );
255- }
256-
257- @ Override
258- public <T > Optional <T > getRawConfigurationParameter (String s , Function <String , T > function ) {
259- return configuration .getRawConfigurationParameter ( s , function );
260- }
261-
262- @ Override
263- public boolean isParallelExecutionEnabled () {
264- return configuration .isParallelExecutionEnabled ();
265- }
266-
267- @ Override
268- public boolean isExtensionAutoDetectionEnabled () {
269- return configuration .isExtensionAutoDetectionEnabled ();
270- }
271-
272- @ Override
273- public ExecutionMode getDefaultExecutionMode () {
274- return configuration .getDefaultExecutionMode ();
275- }
276-
277- @ Override
278- public ExecutionMode getDefaultClassesExecutionMode () {
279- return configuration .getDefaultClassesExecutionMode ();
280- }
281-
282- @ Override
283- public TestInstance .Lifecycle getDefaultTestInstanceLifecycle () {
284- return configuration .getDefaultTestInstanceLifecycle ();
285- }
286-
287- @ Override
288- public Predicate <ExecutionCondition > getExecutionConditionFilter () {
289- return configuration .getExecutionConditionFilter ();
290- }
291-
292- @ Override
293- public DisplayNameGenerator getDefaultDisplayNameGenerator () {
294- return displayNameGenerator ;
295- }
296-
297- @ Override
298- public Optional <MethodOrderer > getDefaultTestMethodOrderer () {
299- return configuration .getDefaultTestMethodOrderer ();
300- }
301-
302- @ Override
303- public Optional <ClassOrderer > getDefaultTestClassOrderer () {
304- return configuration .getDefaultTestClassOrderer ();
305- }
306-
307- @ Override
308- public CleanupMode getDefaultTempDirCleanupMode () {
309- return configuration .getDefaultTempDirCleanupMode ();
310- }
311-
312- @ Override
313- public Supplier <TempDirFactory > getDefaultTempDirFactorySupplier () {
314- return configuration .getDefaultTempDirFactorySupplier ();
270+ public Object invoke (Object proxy , Method method , Object [] args ) throws Throwable {
271+ if ( "getDefaultDisplayNameGenerator" .equals ( method .getName () ) ) {
272+ return displayNameGenerator ;
273+ }
274+ else {
275+ return method .invoke ( configuration , args );
276+ }
315277 }
316278 }
317279
318- private static class DelegatingDisplayNameGenerator implements DisplayNameGenerator {
280+ private static class DisplayNameGeneratorInvocationHandler implements InvocationHandler {
319281
320282 private final DisplayNameGenerator delegate ;
321283 private final Object id ;
322284
323- private DelegatingDisplayNameGenerator (DisplayNameGenerator delegate , Object id ) {
285+ private DisplayNameGeneratorInvocationHandler (DisplayNameGenerator delegate , Object id ) {
324286 this .delegate = delegate ;
325287 this .id = id ;
326288 }
327289
328- @ Override
329- public String generateDisplayNameForClass (Class <?> aClass ) {
330- return prefix () + delegate .generateDisplayNameForClass ( aClass );
331- }
332-
333290 private String prefix () {
334291 return "Enhanced" + ( id == null ? "" : "[" + id + "]" ) + ":" ;
335292 }
336293
337294 @ Override
338- public String generateDisplayNameForNestedClass (Class <?> aClass ) {
339- return prefix () + delegate .generateDisplayNameForNestedClass ( aClass );
340- }
341-
342- @ Override
343- public String generateDisplayNameForMethod (Class <?> aClass , Method method ) {
344- return prefix () + delegate .generateDisplayNameForMethod ( aClass , method );
295+ public Object invoke (Object proxy , Method method , Object [] args ) throws Throwable {
296+ final Object result = method .invoke ( delegate , args );
297+ if ( method .getDeclaringClass () == DisplayNameGenerator .class ) {
298+ return prefix () + result ;
299+ }
300+ return result ;
345301 }
346302 }
347303
@@ -350,9 +306,7 @@ private static class EnhancementWorkedCheckMethodTestDescriptor extends TestMeth
350306 private final boolean enhanced ;
351307 private final String [] classes ;
352308
353- public EnhancementWorkedCheckMethodTestDescriptor (UniqueId uniqueId , Class <?> testClass ,
354- JupiterConfiguration configuration ,
355- boolean enhanced , String [] classes ) {
309+ public EnhancementWorkedCheckMethodTestDescriptor (UniqueId uniqueId , Class <?> testClass , JupiterConfiguration configuration , boolean enhanced , String [] classes ) {
356310 super (
357311 prepareId ( uniqueId , testMethod ( enhanced ) ),
358312 testClass , testMethod ( enhanced ),
0 commit comments