From c81b028f4ac121f4939341ef724465d307274cd0 Mon Sep 17 00:00:00 2001 From: Rafael Winterhalter Date: Wed, 16 Sep 2020 01:11:01 +0200 Subject: [PATCH] Fixing "best" constructor choice. --- .../internal/creation/bytebuddy/MockMethodAdvice.java | 10 +++++++--- src/main/java/org/mockito/internal/util/MockUtil.java | 6 +++++- 2 files changed, 12 insertions(+), 4 deletions(-) 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..9323368a14 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,17 @@ 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) { + // We are choosing the shortest constructor with regards to arguments. + // Yet, we prefer a non-package-private constructor since they require + // the super class to be on the same class loader. 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) { diff --git a/src/main/java/org/mockito/internal/util/MockUtil.java b/src/main/java/org/mockito/internal/util/MockUtil.java index 9ee2cd5315..25a29d2c0d 100644 --- a/src/main/java/org/mockito/internal/util/MockUtil.java +++ b/src/main/java/org/mockito/internal/util/MockUtil.java @@ -56,11 +56,12 @@ public static T createMock(MockCreationSettings settings) { return mock; } - public static void resetMock(T mock) { + public static void resetMock(Object mock) { MockHandler oldHandler = getMockHandler(mock); MockCreationSettings settings = oldHandler.getMockSettings(); MockHandler newHandler = createMockHandler(settings); + mock = resolve(mock); mockMaker.resetMock(mock, newHandler, settings); } @@ -110,6 +111,9 @@ public static boolean isMock(Object mock) { } private static Object resolve(Object mock) { + if (mock instanceof Class) { // static mocks are resolved by definition + return mock; + } for (MockResolver mockResolver : Plugins.getMockResolvers()) { mock = mockResolver.resolve(mock); }