From 43ac1c81342660fd77578d363d6444fcf62038ed Mon Sep 17 00:00:00 2001 From: Rafael Winterhalter Date: Wed, 12 Jan 2022 22:34:43 +0100 Subject: [PATCH] Add ignore matcher for Groovy meta methods for inline Byte Buddy mock maker. Fixes #2522. --- .../creation/bytebuddy/BytecodeGenerator.java | 11 +++++++++++ .../creation/bytebuddy/InlineBytecodeGenerator.java | 1 + .../creation/bytebuddy/SubclassBytecodeGenerator.java | 7 +------ 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/mockito/internal/creation/bytebuddy/BytecodeGenerator.java b/src/main/java/org/mockito/internal/creation/bytebuddy/BytecodeGenerator.java index 392392d2d9..5ff6395e18 100644 --- a/src/main/java/org/mockito/internal/creation/bytebuddy/BytecodeGenerator.java +++ b/src/main/java/org/mockito/internal/creation/bytebuddy/BytecodeGenerator.java @@ -4,6 +4,12 @@ */ package org.mockito.internal.creation.bytebuddy; +import net.bytebuddy.description.method.MethodDescription; +import net.bytebuddy.matcher.ElementMatcher; + +import static net.bytebuddy.matcher.ElementMatchers.*; +import static net.bytebuddy.matcher.ElementMatchers.named; + public interface BytecodeGenerator { Class mockClass(MockFeatures features); @@ -13,4 +19,9 @@ public interface BytecodeGenerator { void mockClassStatic(Class type); default void clearAllCaches() {} + + static ElementMatcher isGroovyMethod() { + return isDeclaredBy(named("groovy.lang.GroovyObjectSupport")) + .or(isAnnotatedWith(named("groovy.transform.Internal"))); + } } diff --git a/src/main/java/org/mockito/internal/creation/bytebuddy/InlineBytecodeGenerator.java b/src/main/java/org/mockito/internal/creation/bytebuddy/InlineBytecodeGenerator.java index 10b73c81a2..7b8293ff09 100644 --- a/src/main/java/org/mockito/internal/creation/bytebuddy/InlineBytecodeGenerator.java +++ b/src/main/java/org/mockito/internal/creation/bytebuddy/InlineBytecodeGenerator.java @@ -387,6 +387,7 @@ public byte[] transform( // ,ClassFileLocator.ForClassLoader.ofSystemLoader() // ) ) + .ignoreAlso(BytecodeGenerator.isGroovyMethod()) // Note: The VM erases parameter meta data from the provided class file // (bug). We just add this information manually. .visit(new ParameterWritingVisitorWrapper(classBeingRedefined)) diff --git a/src/main/java/org/mockito/internal/creation/bytebuddy/SubclassBytecodeGenerator.java b/src/main/java/org/mockito/internal/creation/bytebuddy/SubclassBytecodeGenerator.java index f67fdfc5a6..fe89070150 100644 --- a/src/main/java/org/mockito/internal/creation/bytebuddy/SubclassBytecodeGenerator.java +++ b/src/main/java/org/mockito/internal/creation/bytebuddy/SubclassBytecodeGenerator.java @@ -224,7 +224,7 @@ public Class mockClass(MockFeatures features) { byteBuddy .subclass(features.mockedType) .name(name) - .ignoreAlso(isGroovyMethod()) + .ignoreAlso(BytecodeGenerator.isGroovyMethod()) .annotateType( features.stripAnnotations ? new Annotation[0] @@ -293,11 +293,6 @@ private Collection> getAllTypes(Class type) { return supertypes; } - private static ElementMatcher isGroovyMethod() { - return isDeclaredBy(named("groovy.lang.GroovyObjectSupport")) - .or(isAnnotatedWith(named("groovy.transform.Internal"))); - } - private boolean isComingFromJDK(Class type) { // Comes from the manifest entry : // Implementation-Title: Java Runtime Environment