From 5600370bd6b615df4d36bba7f1bb010ff562450a Mon Sep 17 00:00:00 2001 From: Rafael Winterhalter Date: Fri, 21 Apr 2023 15:48:23 +0200 Subject: [PATCH] Fixes 2972: Weakens visibility constraint what breaks spying on encapsulated objects where a super type in a different package declares only a protected constructor. --- .../creation/bytebuddy/MockMethodAdvice.java | 4 +-- .../InlineDelegateByteBuddyMockMakerTest.java | 30 +++++++++++++++++-- .../bytebuddy/sample/DifferentPackage.java | 17 +++++++++++ 3 files changed, 47 insertions(+), 4 deletions(-) create mode 100644 src/test/java/org/mockito/internal/creation/bytebuddy/sample/DifferentPackage.java 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 2c3649ea0e..245917671b 100644 --- a/src/main/java/org/mockito/internal/creation/bytebuddy/MockMethodAdvice.java +++ b/src/main/java/org/mockito/internal/creation/bytebuddy/MockMethodAdvice.java @@ -4,7 +4,7 @@ */ package org.mockito.internal.creation.bytebuddy; -import static net.bytebuddy.matcher.ElementMatchers.isAccessibleTo; +import static net.bytebuddy.matcher.ElementMatchers.isVisibleTo; import static net.bytebuddy.matcher.ElementMatchers.isConstructor; import static net.bytebuddy.matcher.ElementMatchers.isStatic; import static net.bytebuddy.matcher.ElementMatchers.not; @@ -398,7 +398,7 @@ public MethodVisitor wrap( .getSuperClass() .asErasure() .getDeclaredMethods() - .filter(isConstructor().and(isAccessibleTo(instrumentedType))); + .filter(isConstructor().and(isVisibleTo(instrumentedType))); int arguments = Integer.MAX_VALUE; boolean packagePrivate = true; MethodDescription.InDefinedShape current = null; diff --git a/src/test/java/org/mockito/internal/creation/bytebuddy/InlineDelegateByteBuddyMockMakerTest.java b/src/test/java/org/mockito/internal/creation/bytebuddy/InlineDelegateByteBuddyMockMakerTest.java index 89aa415a96..305a5264a2 100644 --- a/src/test/java/org/mockito/internal/creation/bytebuddy/InlineDelegateByteBuddyMockMakerTest.java +++ b/src/test/java/org/mockito/internal/creation/bytebuddy/InlineDelegateByteBuddyMockMakerTest.java @@ -29,6 +29,7 @@ import org.mockito.Answers; import org.mockito.exceptions.base.MockitoException; import org.mockito.internal.creation.MockSettingsImpl; +import org.mockito.internal.creation.bytebuddy.sample.DifferentPackage; import org.mockito.internal.creation.settings.CreationSettings; import org.mockito.internal.handler.MockHandlerImpl; import org.mockito.internal.stubbing.answers.Returns; @@ -96,6 +97,22 @@ public void should_create_mock_from_accessible_inner_spy() throws Exception { }); } + @Test + public void should_create_mock_from_visible_inner_spy() throws Exception { + MockCreationSettings settings = settingsFor(DifferentPackage.class); + Optional proxy = + mockMaker.createSpy( + settings, + new MockHandlerImpl<>(settings), + new DifferentPackage(new Object(), new Object())); + assertThat(proxy) + .hasValueSatisfying( + spy -> { + assertThat(spy.p1).isNotNull(); + assertThat(spy.p2).isNotNull(); + }); + } + @Test public void should_create_mock_from_non_constructable_class() throws Exception { MockCreationSettings settings = @@ -667,7 +684,7 @@ static class Outer { final Object p1; - private Outer(final Object p1) { + private Outer(Object p1) { this.p1 = p1; } @@ -675,10 +692,19 @@ private static class Inner extends Outer { final Object p2; - Inner(final Object p1, final Object p2) { + Inner(Object p1, Object p2) { super(p1); this.p2 = p2; } } } + + public static class SamePackage { + + public final Object p1; + + protected SamePackage(Object p1) { + this.p1 = p1; + } + } } diff --git a/src/test/java/org/mockito/internal/creation/bytebuddy/sample/DifferentPackage.java b/src/test/java/org/mockito/internal/creation/bytebuddy/sample/DifferentPackage.java new file mode 100644 index 0000000000..9ae382ec5a --- /dev/null +++ b/src/test/java/org/mockito/internal/creation/bytebuddy/sample/DifferentPackage.java @@ -0,0 +1,17 @@ +/* + * Copyright (c) 2017 Mockito contributors + * This program is made available under the terms of the MIT License. + */ +package org.mockito.internal.creation.bytebuddy.sample; + +import org.mockito.internal.creation.bytebuddy.InlineDelegateByteBuddyMockMakerTest; + +public class DifferentPackage extends InlineDelegateByteBuddyMockMakerTest.SamePackage { + + public final Object p2; + + public DifferentPackage(Object p1, Object p2) { + super(p1); + this.p2 = p2; + } +}