Skip to content

Commit 6c2cba5

Browse files
committed
Polish bean override internals
1 parent c832d5f commit 6c2cba5

File tree

6 files changed

+54
-78
lines changed

6 files changed

+54
-78
lines changed

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

+22-22
Original file line numberDiff line numberDiff line change
@@ -35,21 +35,21 @@
3535
import org.springframework.test.context.bean.override.OverrideMetadata;
3636
import org.springframework.util.Assert;
3737
import org.springframework.util.ClassUtils;
38-
import org.springframework.util.ObjectUtils;
3938
import org.springframework.util.StringUtils;
4039

4140
/**
4241
* {@link OverrideMetadata} implementation for Mockito {@code mock} support.
4342
*
4443
* @author Phillip Webb
4544
* @author Stephane Nicoll
45+
* @author Sam Brannen
4646
* @since 6.2
4747
*/
4848
class MockitoBeanOverrideMetadata extends MockitoOverrideMetadata {
4949

5050
private final Set<Class<?>> extraInterfaces;
5151

52-
private final Answers answer;
52+
private final Answers answers;
5353

5454
private final boolean serializable;
5555

@@ -59,21 +59,22 @@ class MockitoBeanOverrideMetadata extends MockitoOverrideMetadata {
5959
annotation.reset(), annotation.extraInterfaces(), annotation.answers(), annotation.serializable());
6060
}
6161

62-
MockitoBeanOverrideMetadata(Field field, ResolvableType typeToMock, @Nullable String beanName, MockReset reset,
63-
Class<?>[] extraInterfaces, @Nullable Answers answer, boolean serializable) {
62+
private MockitoBeanOverrideMetadata(Field field, ResolvableType typeToMock, @Nullable String beanName, MockReset reset,
63+
Class<?>[] extraInterfaces, @Nullable Answers answers, boolean serializable) {
6464

6565
super(field, typeToMock, beanName, BeanOverrideStrategy.REPLACE_OR_CREATE_DEFINITION, reset, false);
6666
Assert.notNull(typeToMock, "'typeToMock' must not be null");
6767
this.extraInterfaces = asClassSet(extraInterfaces);
68-
this.answer = (answer != null) ? answer : Answers.RETURNS_DEFAULTS;
68+
this.answers = (answers != null ? answers : Answers.RETURNS_DEFAULTS);
6969
this.serializable = serializable;
7070
}
7171

72-
private static Set<Class<?>> asClassSet(@Nullable Class<?>[] classes) {
73-
Set<Class<?>> classSet = new LinkedHashSet<>();
74-
if (classes != null) {
75-
classSet.addAll(Arrays.asList(classes));
72+
73+
private static Set<Class<?>> asClassSet(Class<?>[] classes) {
74+
if (classes.length == 0) {
75+
return Collections.emptySet();
7676
}
77+
Set<Class<?>> classSet = new LinkedHashSet<>(Arrays.asList(classes));
7778
return Collections.unmodifiableSet(classSet);
7879
}
7980

@@ -90,12 +91,12 @@ Set<Class<?>> getExtraInterfaces() {
9091
* Return the {@link Answers}.
9192
* @return the answers mode
9293
*/
93-
Answers getAnswer() {
94-
return this.answer;
94+
Answers getAnswers() {
95+
return this.answers;
9596
}
9697

9798
/**
98-
* Return if the mock is serializable.
99+
* Determine if the mock is serializable.
99100
* @return {@code true} if the mock is serializable
100101
*/
101102
boolean isSerializable() {
@@ -108,15 +109,15 @@ protected Object createOverride(String beanName, @Nullable BeanDefinition existi
108109
}
109110

110111
@SuppressWarnings("unchecked")
111-
<T> T createMock(String name) {
112+
private <T> T createMock(String name) {
112113
MockSettings settings = MockReset.withSettings(getReset());
113114
if (StringUtils.hasLength(name)) {
114115
settings.name(name);
115116
}
116117
if (!this.extraInterfaces.isEmpty()) {
117118
settings.extraInterfaces(ClassUtils.toClassArray(this.extraInterfaces));
118119
}
119-
settings.defaultAnswer(this.answer);
120+
settings.defaultAnswer(this.answers);
120121
if (this.serializable) {
121122
settings.serializable();
122123
}
@@ -132,27 +133,26 @@ public boolean equals(@Nullable Object other) {
132133
if (other == null || other.getClass() != getClass()) {
133134
return false;
134135
}
135-
MockitoBeanOverrideMetadata that = (MockitoBeanOverrideMetadata) other;
136-
boolean result = super.equals(that);
137-
result = result && ObjectUtils.nullSafeEquals(this.extraInterfaces, that.extraInterfaces);
138-
result = result && ObjectUtils.nullSafeEquals(this.answer, that.answer);
139-
result = result && this.serializable == that.serializable;
140-
return result;
136+
return (other instanceof MockitoBeanOverrideMetadata that && super.equals(that) &&
137+
(this.serializable == that.serializable) && (this.answers == that.answers) &&
138+
Objects.equals(this.extraInterfaces, that.extraInterfaces));
141139
}
142140

143141
@Override
144142
public int hashCode() {
145-
return Objects.hash(this.extraInterfaces, this.answer, this.serializable) + super.hashCode();
143+
return super.hashCode() + Objects.hash(this.extraInterfaces, this.answers, this.serializable);
146144
}
147145

148146
@Override
149147
public String toString() {
150148
return new ToStringCreator(this)
149+
.append("field", getField())
151150
.append("beanType", getBeanType())
152151
.append("beanName", getBeanName())
152+
.append("strategy", getStrategy())
153153
.append("reset", getReset())
154154
.append("extraInterfaces", getExtraInterfaces())
155-
.append("answer", getAnswer())
155+
.append("answers", getAnswers())
156156
.append("serializable", isSerializable())
157157
.toString();
158158
}

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

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

1919
import java.util.ArrayList;
20-
import java.util.Iterator;
2120
import java.util.List;
2221

22+
import org.mockito.Mockito;
23+
2324
/**
2425
* Beans created using Mockito.
2526
*
2627
* @author Andy Wilkinson
28+
* @author Sam Brannen
2729
* @since 6.2
2830
*/
29-
class MockitoBeans implements Iterable<Object> {
31+
class MockitoBeans {
3032

3133
private final List<Object> beans = new ArrayList<>();
3234

@@ -35,9 +37,8 @@ void add(Object bean) {
3537
this.beans.add(bean);
3638
}
3739

38-
@Override
39-
public Iterator<Object> iterator() {
40-
return this.beans.iterator();
40+
void resetAll() {
41+
this.beans.forEach(Mockito::reset);
4142
}
4243

4344
}

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

+19-13
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,17 @@
2222
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
2323
import org.springframework.beans.factory.config.SingletonBeanRegistry;
2424
import org.springframework.core.ResolvableType;
25+
import org.springframework.core.style.ToStringCreator;
2526
import org.springframework.lang.Nullable;
2627
import org.springframework.test.context.bean.override.BeanOverrideStrategy;
2728
import org.springframework.test.context.bean.override.OverrideMetadata;
28-
import org.springframework.util.ObjectUtils;
2929

3030
/**
3131
* Base {@link OverrideMetadata} implementation for Mockito.
3232
*
3333
* @author Phillip Webb
3434
* @author Stephane Nicoll
35+
* @author Sam Brannen
3536
* @since 6.2
3637
*/
3738
abstract class MockitoOverrideMetadata extends OverrideMetadata {
@@ -45,7 +46,7 @@ protected MockitoOverrideMetadata(Field field, ResolvableType beanType, @Nullabl
4546
BeanOverrideStrategy strategy, @Nullable MockReset reset, boolean proxyTargetAware) {
4647

4748
super(field, beanType, beanName, strategy);
48-
this.reset = (reset != null) ? reset : MockReset.AFTER;
49+
this.reset = (reset != null ? reset : MockReset.AFTER);
4950
this.proxyTargetAware = proxyTargetAware;
5051
}
5152

@@ -73,10 +74,9 @@ protected void track(Object mock, SingletonBeanRegistry trackingBeanRegistry) {
7374
tracker = (MockitoBeans) trackingBeanRegistry.getSingleton(MockitoBeans.class.getName());
7475
}
7576
catch (NoSuchBeanDefinitionException ignored) {
76-
7777
}
7878
if (tracker == null) {
79-
tracker= new MockitoBeans();
79+
tracker = new MockitoBeans();
8080
trackingBeanRegistry.registerSingleton(MockitoBeans.class.getName(), tracker);
8181
}
8282
tracker.add(mock);
@@ -87,19 +87,25 @@ public boolean equals(@Nullable Object other) {
8787
if (other == this) {
8888
return true;
8989
}
90-
if (other == null || !getClass().isAssignableFrom(other.getClass())) {
91-
return false;
92-
}
93-
MockitoOverrideMetadata that = (MockitoOverrideMetadata) other;
94-
boolean result = super.equals(that);
95-
result = result && ObjectUtils.nullSafeEquals(this.reset, that.reset);
96-
result = result && ObjectUtils.nullSafeEquals(this.proxyTargetAware, that.proxyTargetAware);
97-
return result;
90+
return (other instanceof MockitoOverrideMetadata that && super.equals(that) &&
91+
(this.reset == that.reset) && (this.proxyTargetAware == that.proxyTargetAware));
9892
}
9993

10094
@Override
10195
public int hashCode() {
102-
return Objects.hash(this.reset, this.proxyTargetAware) + super.hashCode();
96+
return super.hashCode() + Objects.hash(this.reset, this.proxyTargetAware);
97+
}
98+
99+
@Override
100+
public String toString() {
101+
return new ToStringCreator(this)
102+
.append("field", getField())
103+
.append("beanType", getBeanType())
104+
.append("beanName", getBeanName())
105+
.append("strategy", getStrategy())
106+
.append("reset", getReset())
107+
.append("proxyTargetAware", isProxyTargetAware())
108+
.toString();
103109
}
104110

105111
}

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

+1-6
Original file line numberDiff line numberDiff line change
@@ -87,12 +87,7 @@ private void resetMocks(ConfigurableApplicationContext applicationContext, MockR
8787
}
8888
}
8989
try {
90-
MockitoBeans mockedBeans = beanFactory.getBean(MockitoBeans.class);
91-
for (Object mockedBean : mockedBeans) {
92-
if (reset.equals(MockReset.get(mockedBean))) {
93-
Mockito.reset(mockedBean);
94-
}
95-
}
90+
beanFactory.getBean(MockitoBeans.class).resetAll();
9691
}
9792
catch (NoSuchBeanDefinitionException ex) {
9893
// Continue

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

+1-12
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727

2828
import org.springframework.beans.factory.config.BeanDefinition;
2929
import org.springframework.core.ResolvableType;
30-
import org.springframework.core.style.ToStringCreator;
3130
import org.springframework.lang.Nullable;
3231
import org.springframework.test.context.bean.override.BeanOverrideStrategy;
3332
import org.springframework.test.context.bean.override.OverrideMetadata;
@@ -68,8 +67,7 @@ protected Object createOverride(String beanName, @Nullable BeanDefinition existi
6867
}
6968

7069
@SuppressWarnings("unchecked")
71-
<T> T createSpy(String name, Object instance) {
72-
Assert.notNull(instance, "Instance must not be null");
70+
private <T> T createSpy(String name, Object instance) {
7371
Class<?> resolvedTypeToOverride = getBeanType().resolve();
7472
Assert.notNull(resolvedTypeToOverride, "Failed to resolve type to override");
7573
Assert.isInstanceOf(resolvedTypeToOverride, instance);
@@ -96,15 +94,6 @@ <T> T createSpy(String name, Object instance) {
9694
return (T) Mockito.mock(toSpy, settings);
9795
}
9896

99-
@Override
100-
public String toString() {
101-
return new ToStringCreator(this)
102-
.append("beanName", getBeanName())
103-
.append("beanType", getBeanType())
104-
.append("reset", getReset())
105-
.toString();
106-
}
107-
10897

10998
/**
11099
* A {@link VerificationStartedListener} that bypasses any proxy created by

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

+5-20
Original file line numberDiff line numberDiff line change
@@ -56,22 +56,14 @@ public class MockitoBeanForByNameLookupIntegrationTests {
5656

5757

5858
@Test
59-
void fieldHasOverride(ApplicationContext ctx) {
60-
assertThat(ctx.getBean("field"))
61-
.isInstanceOf(ExampleService.class)
62-
.satisfies(o -> assertThat(Mockito.mockingDetails(o).isMock()).as("isMock").isTrue())
63-
.isSameAs(this.field);
64-
65-
assertThat(this.field.greeting()).as("mocked greeting").isNull();
66-
}
67-
68-
@Test
69-
void renamedFieldHasOverride(ApplicationContext ctx) {
59+
void fieldAndRenamedFieldHaveSameOverride(ApplicationContext ctx) {
7060
assertThat(ctx.getBean("field"))
7161
.isInstanceOf(ExampleService.class)
7262
.satisfies(o -> assertThat(Mockito.mockingDetails(o).isMock()).as("isMock").isTrue())
63+
.isSameAs(this.field)
7364
.isSameAs(this.renamed1);
7465

66+
assertThat(this.field.greeting()).as("mocked greeting").isNull();
7567
assertThat(this.renamed1.greeting()).as("mocked greeting").isNull();
7668
}
7769

@@ -91,18 +83,11 @@ void fieldIsMockedWhenNoOriginalBean(ApplicationContext ctx) {
9183
public class MockitoBeanNestedTests {
9284

9385
@Test
94-
void fieldHasOverride(ApplicationContext ctx) {
95-
assertThat(ctx.getBean("nestedField"))
96-
.isInstanceOf(ExampleService.class)
97-
.satisfies(o -> assertThat(Mockito.mockingDetails(o).isMock()).as("isMock").isTrue())
98-
.isSameAs(nestedField);
99-
}
100-
101-
@Test
102-
void renamedFieldHasOverride(ApplicationContext ctx) {
86+
void fieldAndRenamedFieldHaveSameOverride(ApplicationContext ctx) {
10387
assertThat(ctx.getBean("nestedField"))
10488
.isInstanceOf(ExampleService.class)
10589
.satisfies(o -> assertThat(Mockito.mockingDetails(o).isMock()).as("isMock").isTrue())
90+
.isSameAs(nestedField)
10691
.isSameAs(renamed2);
10792
}
10893

0 commit comments

Comments
 (0)