Skip to content

Commit 5bf179b

Browse files
committed
Remove proxyTargetAware attribute from @⁠MockitoSpyBean
This commit removes the proxyTargetAware attribute from @⁠MockitoSpyBean while keeping the underlying feature in tact (i.e., transparent verification for spies created via @⁠MockitoSpyBean). Closes gh-33775
1 parent 20d21a8 commit 5bf179b

File tree

6 files changed

+32
-89
lines changed

6 files changed

+32
-89
lines changed

spring-test/src/main/java/org/springframework/test/context/bean/override/mockito/AbstractMockitoBeanOverrideHandler.java

+4-17
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
package org.springframework.test.context.bean.override.mockito;
1818

1919
import java.lang.reflect.Field;
20-
import java.util.Objects;
2120

2221
import org.springframework.beans.factory.config.SingletonBeanRegistry;
2322
import org.springframework.core.ResolvableType;
@@ -38,15 +37,12 @@ abstract class AbstractMockitoBeanOverrideHandler extends BeanOverrideHandler {
3837

3938
private final MockReset reset;
4039

41-
private final boolean proxyTargetAware;
4240

43-
44-
protected AbstractMockitoBeanOverrideHandler(Field field, ResolvableType beanType, @Nullable String beanName,
45-
BeanOverrideStrategy strategy, @Nullable MockReset reset, boolean proxyTargetAware) {
41+
protected AbstractMockitoBeanOverrideHandler(Field field, ResolvableType beanType,
42+
@Nullable String beanName, BeanOverrideStrategy strategy, @Nullable MockReset reset) {
4643

4744
super(field, beanType, beanName, strategy);
4845
this.reset = (reset != null ? reset : MockReset.AFTER);
49-
this.proxyTargetAware = proxyTargetAware;
5046
}
5147

5248

@@ -58,14 +54,6 @@ MockReset getReset() {
5854
return this.reset;
5955
}
6056

61-
/**
62-
* Return if AOP advised beans should be proxy target aware.
63-
* @return if proxy target aware
64-
*/
65-
boolean isProxyTargetAware() {
66-
return this.proxyTargetAware;
67-
}
68-
6957
@Override
7058
protected void trackOverrideInstance(Object mock, SingletonBeanRegistry trackingBeanRegistry) {
7159
getMockitoBeans(trackingBeanRegistry).add(mock);
@@ -90,12 +78,12 @@ public boolean equals(@Nullable Object other) {
9078
return true;
9179
}
9280
return (other instanceof AbstractMockitoBeanOverrideHandler that && super.equals(that) &&
93-
(this.reset == that.reset) && (this.proxyTargetAware == that.proxyTargetAware));
81+
this.reset == that.reset);
9482
}
9583

9684
@Override
9785
public int hashCode() {
98-
return super.hashCode() + Objects.hash(this.reset, this.proxyTargetAware);
86+
return super.hashCode() + this.reset.hashCode();
9987
}
10088

10189
@Override
@@ -106,7 +94,6 @@ public String toString() {
10694
.append("beanName", getBeanName())
10795
.append("strategy", getStrategy())
10896
.append("reset", getReset())
109-
.append("proxyTargetAware", isProxyTargetAware())
11097
.toString();
11198
}
11299

spring-test/src/main/java/org/springframework/test/context/bean/override/mockito/MockitoBeanOverrideHandler.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ private MockitoBeanOverrideHandler(Field field, ResolvableType typeToMock, @Null
6767
BeanOverrideStrategy strategy, MockReset reset, Class<?>[] extraInterfaces, @Nullable Answers answers,
6868
boolean serializable) {
6969

70-
super(field, typeToMock, beanName, strategy, reset, false);
70+
super(field, typeToMock, beanName, strategy, reset);
7171
Assert.notNull(typeToMock, "'typeToMock' must not be null");
7272
this.extraInterfaces = asClassSet(extraInterfaces);
7373
this.answers = (answers != null ? answers : Answers.RETURNS_DEFAULTS);

spring-test/src/main/java/org/springframework/test/context/bean/override/mockito/MockitoSpyBean.java

-15
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@
2222
import java.lang.annotation.RetentionPolicy;
2323
import java.lang.annotation.Target;
2424

25-
import org.mockito.Mockito;
26-
2725
import org.springframework.core.annotation.AliasFor;
2826
import org.springframework.test.context.bean.override.BeanOverride;
2927

@@ -87,17 +85,4 @@
8785
*/
8886
MockReset reset() default MockReset.AFTER;
8987

90-
/**
91-
* Indicates that Mockito methods such as {@link Mockito#verify(Object)
92-
* verify(mock)} should use the {@code target} of AOP advised beans,
93-
* rather than the proxy itself.
94-
* <p>Defaults to {@code true}.
95-
* <p>If set to {@code false} you may need to use the result of
96-
* {@link org.springframework.test.util.AopTestUtils#getUltimateTargetObject(Object)
97-
* AopTestUtils.getUltimateTargetObject(...)} when calling Mockito methods.
98-
* @return {@code true} if the target of AOP advised beans is used, or
99-
* {@code false} if the proxy is used directly
100-
*/
101-
boolean proxyTargetAware() default true;
102-
10388
}

spring-test/src/main/java/org/springframework/test/context/bean/override/mockito/MockitoSpyBeanOverrideHandler.java

+9-6
Original file line numberDiff line numberDiff line change
@@ -39,19 +39,24 @@
3939
* @author Phillip Webb
4040
* @author Simon Baslé
4141
* @author Stephane Nicoll
42+
* @author Sam Brannen
4243
* @since 6.2
4344
*/
4445
class MockitoSpyBeanOverrideHandler extends AbstractMockitoBeanOverrideHandler {
4546

47+
private static final VerificationStartedListener verificationStartedListener =
48+
new SpringAopBypassingVerificationStartedListener();
49+
50+
4651
MockitoSpyBeanOverrideHandler(Field field, ResolvableType typeToSpy, MockitoSpyBean spyAnnotation) {
4752
this(field, typeToSpy, (StringUtils.hasText(spyAnnotation.name()) ? spyAnnotation.name() : null),
48-
spyAnnotation.reset(), spyAnnotation.proxyTargetAware());
53+
spyAnnotation.reset());
4954
}
5055

5156
MockitoSpyBeanOverrideHandler(Field field, ResolvableType typeToSpy, @Nullable String beanName,
52-
MockReset reset, boolean proxyTargetAware) {
57+
MockReset reset) {
5358

54-
super(field, typeToSpy, beanName, BeanOverrideStrategy.WRAP, reset, proxyTargetAware);
59+
super(field, typeToSpy, beanName, BeanOverrideStrategy.WRAP, reset);
5560
Assert.notNull(typeToSpy, "typeToSpy must not be null");
5661
}
5762

@@ -77,9 +82,7 @@ private Object createSpy(String name, Object instance) {
7782
if (StringUtils.hasLength(name)) {
7883
settings.name(name);
7984
}
80-
if (isProxyTargetAware()) {
81-
settings.verificationStartedListeners(new SpringAopBypassingVerificationStartedListener());
82-
}
85+
settings.verificationStartedListeners(verificationStartedListener);
8386
Class<?> toSpy;
8487
if (Proxy.isProxyClass(instance.getClass())) {
8588
settings.defaultAnswer(AdditionalAnswers.delegatesTo(instance));

spring-test/src/test/java/org/springframework/test/context/bean/override/mockito/MockitoBeanContextCustomizerEqualityTests.java

+9-21
Original file line numberDiff line numberDiff line change
@@ -34,50 +34,45 @@ class MockitoBeanContextCustomizerEqualityTests {
3434

3535
@Test
3636
void contextCustomizerWithSameMockByNameInDifferentClassIsEqual() {
37-
assertThat(createContextCustomizer(Case1ByName.class)).isEqualTo(createContextCustomizer(Case2ByName.class));
37+
assertThat(customizerFor(Case1ByName.class)).isEqualTo(customizerFor(Case2ByName.class));
3838
}
3939

4040
@Test
4141
void contextCustomizerWithSameMockByTypeInDifferentClassIsEqual() {
42-
assertThat(createContextCustomizer(Case1ByType.class)).isEqualTo(createContextCustomizer(Case2ByTypeSameFieldName.class));
42+
assertThat(customizerFor(Case1ByType.class)).isEqualTo(customizerFor(Case2ByTypeSameFieldName.class));
4343
}
4444

4545
@Test
4646
void contextCustomizerWithSameMockByTypeAndDifferentFieldNamesAreNotEqual() {
47-
assertThat(createContextCustomizer(Case1ByType.class)).isNotEqualTo(createContextCustomizer(Case2ByType.class));
47+
assertThat(customizerFor(Case1ByType.class)).isNotEqualTo(customizerFor(Case2ByType.class));
4848
}
4949

5050
@Test
5151
void contextCustomizerWithSameSpyByNameInDifferentClassIsEqual() {
52-
assertThat(createContextCustomizer(Case4ByName.class)).isEqualTo(createContextCustomizer(Case5ByName.class));
52+
assertThat(customizerFor(Case4ByName.class)).isEqualTo(customizerFor(Case5ByName.class));
5353
}
5454

5555
@Test
5656
void contextCustomizerWithSameSpyByTypeInDifferentClassIsEqual() {
57-
assertThat(createContextCustomizer(Case4ByType.class)).isEqualTo(createContextCustomizer(Case5ByTypeSameFieldName.class));
57+
assertThat(customizerFor(Case4ByType.class)).isEqualTo(customizerFor(Case5ByTypeSameFieldName.class));
5858
}
5959

6060
@Test
6161
void contextCustomizerWithSameSpyByTypeAndDifferentFieldNamesAreNotEqual() {
62-
assertThat(createContextCustomizer(Case4ByType.class)).isNotEqualTo(createContextCustomizer(Case5ByType.class));
62+
assertThat(customizerFor(Case4ByType.class)).isNotEqualTo(customizerFor(Case5ByType.class));
6363
}
6464

6565
@Test
6666
void contextCustomizerWithSimilarMockButDifferentAnswersIsNotEqual() {
67-
assertThat(createContextCustomizer(Case1ByType.class)).isNotEqualTo(createContextCustomizer(Case3.class));
68-
}
69-
70-
@Test
71-
void contextCustomizerWithSimilarSpyButDifferentProxyTargetClassFlagIsNotEqual() {
72-
assertThat(createContextCustomizer(Case5ByType.class)).isNotEqualTo(createContextCustomizer(Case6.class));
67+
assertThat(customizerFor(Case1ByType.class)).isNotEqualTo(customizerFor(Case3.class));
7368
}
7469

7570
@Test
7671
void contextCustomizerWithMockAndSpyAreNotEqual() {
77-
assertThat(createContextCustomizer(Case1ByType.class)).isNotEqualTo(createContextCustomizer(Case4ByType.class));
72+
assertThat(customizerFor(Case1ByType.class)).isNotEqualTo(customizerFor(Case4ByType.class));
7873
}
7974

80-
private ContextCustomizer createContextCustomizer(Class<?> testClass) {
75+
private ContextCustomizer customizerFor(Class<?> testClass) {
8176
ContextCustomizer customizer = BeanOverrideContextCustomizerTestUtils.createContextCustomizer(testClass);
8277
assertThat(customizer).isNotNull();
8378
return customizer;
@@ -160,11 +155,4 @@ static class Case5ByTypeSameFieldName {
160155

161156
}
162157

163-
static class Case6 {
164-
165-
@MockitoSpyBean(proxyTargetAware = false)
166-
private String serviceToMock;
167-
168-
}
169-
170158
}

spring-test/src/test/java/org/springframework/test/context/bean/override/mockito/MockitoSpyBeanOverrideHandlerTests.java

+9-29
Original file line numberDiff line numberDiff line change
@@ -49,63 +49,46 @@ void forTestClassSetsNameToAnnotationName() {
4949

5050
@Test
5151
void isEqualToWithSameInstance() {
52-
MockitoSpyBeanOverrideHandler handler = createBeanOverrideHandler(sampleField("service"));
52+
MockitoSpyBeanOverrideHandler handler = handlerFor("service");
5353
assertThat(handler).isEqualTo(handler);
5454
assertThat(handler).hasSameHashCodeAs(handler);
5555
}
5656

5757
@Test
5858
void isEqualToWithSameMetadata() {
59-
MockitoSpyBeanOverrideHandler handler1 = createBeanOverrideHandler(sampleField("service"));
60-
MockitoSpyBeanOverrideHandler handler2 = createBeanOverrideHandler(sampleField("service"));
59+
MockitoSpyBeanOverrideHandler handler1 = handlerFor("service");
60+
MockitoSpyBeanOverrideHandler handler2 = handlerFor("service");
6161
assertThat(handler1).isEqualTo(handler2);
6262
assertThat(handler1).hasSameHashCodeAs(handler2);
6363
}
6464

6565
@Test
6666
void isNotEqualToByTypeLookupWithSameMetadataButDifferentField() {
67-
MockitoSpyBeanOverrideHandler handler1 = createBeanOverrideHandler(sampleField("service"));
68-
MockitoSpyBeanOverrideHandler handler2 = createBeanOverrideHandler(sampleField("service2"));
69-
assertThat(handler1).isNotEqualTo(handler2);
67+
assertThat(handlerFor("service")).isNotEqualTo(handlerFor("service2"));
7068
}
7169

7270
@Test
7371
void isEqualToByNameLookupWithSameMetadataButDifferentField() {
74-
MockitoSpyBeanOverrideHandler handler1 = createBeanOverrideHandler(sampleField("service3"));
75-
MockitoSpyBeanOverrideHandler handler2 = createBeanOverrideHandler(sampleField("service4"));
72+
MockitoSpyBeanOverrideHandler handler1 = handlerFor("service3");
73+
MockitoSpyBeanOverrideHandler handler2 = handlerFor("service4");
7674
assertThat(handler1).isEqualTo(handler2);
7775
assertThat(handler1).hasSameHashCodeAs(handler2);
7876
}
7977

8078
@Test
8179
void isNotEqualToWithSameMetadataButDifferentBeanName() {
82-
MockitoSpyBeanOverrideHandler handler1 = createBeanOverrideHandler(sampleField("service"));
83-
MockitoSpyBeanOverrideHandler handler2 = createBeanOverrideHandler(sampleField("service3"));
84-
assertThat(handler1).isNotEqualTo(handler2);
80+
assertThat(handlerFor("service")).isNotEqualTo(handlerFor("service3"));
8581
}
8682

8783
@Test
8884
void isNotEqualToWithSameMetadataButDifferentReset() {
89-
MockitoSpyBeanOverrideHandler handler1 = createBeanOverrideHandler(sampleField("service"));
90-
MockitoSpyBeanOverrideHandler handler2 = createBeanOverrideHandler(sampleField("service5"));
91-
assertThat(handler1).isNotEqualTo(handler2);
92-
}
93-
94-
@Test
95-
void isNotEqualToWithSameMetadataButDifferentProxyTargetAwareFlag() {
96-
MockitoSpyBeanOverrideHandler handler1 = createBeanOverrideHandler(sampleField("service"));
97-
MockitoSpyBeanOverrideHandler handler2 = createBeanOverrideHandler(sampleField("service6"));
98-
assertThat(handler1).isNotEqualTo(handler2);
85+
assertThat(handlerFor("service")).isNotEqualTo(handlerFor("service5"));
9986
}
10087

10188

102-
private Field sampleField(String fieldName) {
89+
private static MockitoSpyBeanOverrideHandler handlerFor(String fieldName) {
10390
Field field = ReflectionUtils.findField(Sample.class, fieldName);
10491
assertThat(field).isNotNull();
105-
return field;
106-
}
107-
108-
private MockitoSpyBeanOverrideHandler createBeanOverrideHandler(Field field) {
10992
MockitoSpyBean annotation = AnnotatedElementUtils.getMergedAnnotation(field, MockitoSpyBean.class);
11093
return new MockitoSpyBeanOverrideHandler(field, ResolvableType.forClass(field.getType()), annotation);
11194
}
@@ -142,9 +125,6 @@ static class Sample {
142125
@MockitoSpyBean(reset = MockReset.BEFORE)
143126
private String service5;
144127

145-
@MockitoSpyBean(proxyTargetAware = false)
146-
private String service6;
147-
148128
}
149129

150130
}

0 commit comments

Comments
 (0)