From 4a40f582397c40fbce587af3e2f1e16583228e5e Mon Sep 17 00:00:00 2001 From: Rafael Winterhalter Date: Thu, 17 Sep 2020 00:40:07 +0200 Subject: [PATCH] Do not exclude synthetic constructors from instrumentation. Fixes #2040. --- .../creation/bytebuddy/InlineBytecodeGenerator.java | 3 ++- .../internal/creation/bytebuddy/MockMethodAdvice.java | 7 ++++--- 2 files changed, 6 insertions(+), 4 deletions(-) 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 067dea7a04..2bf9d15769 100644 --- a/src/main/java/org/mockito/internal/creation/bytebuddy/InlineBytecodeGenerator.java +++ b/src/main/java/org/mockito/internal/creation/bytebuddy/InlineBytecodeGenerator.java @@ -91,7 +91,8 @@ public InlineBytecodeGenerator( new ByteBuddy() .with(TypeValidation.DISABLED) .with(Implementation.Context.Disabled.Factory.INSTANCE) - .with(MethodGraph.Compiler.ForDeclaredMethods.INSTANCE); + .with(MethodGraph.Compiler.ForDeclaredMethods.INSTANCE) + .ignore(isSynthetic().and(not(isConstructor())).or(isDefaultFinalizer())); mocked = new WeakConcurrentSet<>(WeakConcurrentSet.Cleaner.INLINE); flatMocked = new WeakConcurrentSet<>(WeakConcurrentSet.Cleaner.INLINE); String identifier = RandomString.make(); diff --git a/src/main/java/org/mockito/internal/creation/bytebuddy/MockMethodAdvice.java b/src/main/java/org/mockito/internal/creation/bytebuddy/MockMethodAdvice.java index 69a7ed21a6..a12c70199f 100644 --- a/src/main/java/org/mockito/internal/creation/bytebuddy/MockMethodAdvice.java +++ b/src/main/java/org/mockito/internal/creation/bytebuddy/MockMethodAdvice.java @@ -397,13 +397,14 @@ public MethodVisitor wrap( .getDeclaredMethods() .filter(isConstructor().and(not(isPrivate()))); int arguments = Integer.MAX_VALUE; - boolean visible = false; + boolean packagePrivate = true; MethodDescription.InDefinedShape current = null; for (MethodDescription.InDefinedShape constructor : constructors) { if (constructor.getParameters().size() < arguments - && (!visible || constructor.isPackagePrivate())) { + && (packagePrivate || !constructor.isPackagePrivate())) { + arguments = constructor.getParameters().size(); + packagePrivate = constructor.isPackagePrivate(); current = constructor; - visible = constructor.isPackagePrivate(); } } if (current != null) {