Skip to content

Commit 6dc84b1

Browse files
committed
Ignore non-singleton factory beans when resetting mocks
Closes gh-35324
1 parent eeefb2a commit 6dc84b1

File tree

2 files changed

+51
-4
lines changed

2 files changed

+51
-4
lines changed

spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/mock/mockito/ResetMocksTestExecutionListener.java

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222

2323
import org.mockito.Mockito;
2424

25+
import org.springframework.beans.factory.BeanFactory;
26+
import org.springframework.beans.factory.FactoryBean;
2527
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
2628
import org.springframework.beans.factory.config.BeanDefinition;
2729
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
@@ -79,7 +81,7 @@ private void resetMocks(ConfigurableApplicationContext applicationContext, MockR
7981
BeanDefinition definition = beanFactory.getBeanDefinition(name);
8082
if (definition.isSingleton() && instantiatedSingletons.contains(name)) {
8183
Object bean = getBean(beanFactory, name);
82-
if (reset.equals(MockReset.get(bean))) {
84+
if (bean != null && reset.equals(MockReset.get(bean))) {
8385
Mockito.reset(bean);
8486
}
8587
}
@@ -102,11 +104,25 @@ private void resetMocks(ConfigurableApplicationContext applicationContext, MockR
102104

103105
private Object getBean(ConfigurableListableBeanFactory beanFactory, String name) {
104106
try {
105-
return beanFactory.getBean(name);
107+
if (isStandardBeanOrSingletonFactoryBean(beanFactory, name)) {
108+
return beanFactory.getBean(name);
109+
}
106110
}
107111
catch (Exception ex) {
108-
return beanFactory.getSingleton(name);
112+
// Continue
113+
}
114+
return beanFactory.getSingleton(name);
115+
}
116+
117+
private boolean isStandardBeanOrSingletonFactoryBean(ConfigurableListableBeanFactory beanFactory, String name) {
118+
String factoryBeanName = BeanFactory.FACTORY_BEAN_PREFIX + name;
119+
if (beanFactory.containsBean(factoryBeanName)) {
120+
FactoryBean<?> factoryBean = (FactoryBean<?>) beanFactory.getBean(factoryBeanName);
121+
if (!factoryBean.isSingleton()) {
122+
return false;
123+
}
109124
}
125+
return true;
110126
}
111127

112128
}

spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/mock/mockito/ResetMocksTestExecutionListenerTests.java

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ void test001() {
5353
given(getMock("before").greeting()).willReturn("before");
5454
given(getMock("after").greeting()).willReturn("after");
5555
given(getMock("fromFactoryBean").greeting()).willReturn("fromFactoryBean");
56+
assertThat(this.context.getBean(NonSingletonFactoryBean.class).getObjectInvocations).isEqualTo(0);
5657
}
5758

5859
@Test
@@ -61,6 +62,7 @@ void test002() {
6162
assertThat(getMock("before").greeting()).isNull();
6263
assertThat(getMock("after").greeting()).isNull();
6364
assertThat(getMock("fromFactoryBean").greeting()).isNull();
65+
assertThat(this.context.getBean(NonSingletonFactoryBean.class).getObjectInvocations).isEqualTo(0);
6466
}
6567

6668
ExampleService getMock(String name) {
@@ -109,6 +111,11 @@ WorkingFactoryBean fromFactoryBean() {
109111
return new WorkingFactoryBean();
110112
}
111113

114+
@Bean
115+
NonSingletonFactoryBean nonSingletonFactoryBean() {
116+
return new NonSingletonFactoryBean();
117+
}
118+
112119
}
113120

114121
static class BrokenFactoryBean implements FactoryBean<String> {
@@ -132,9 +139,11 @@ public boolean isSingleton() {
132139

133140
static class WorkingFactoryBean implements FactoryBean<ExampleService> {
134141

142+
private final ExampleService service = mock(ExampleService.class, MockReset.before());
143+
135144
@Override
136145
public ExampleService getObject() {
137-
return mock(ExampleService.class, MockReset.before());
146+
return this.service;
138147
}
139148

140149
@Override
@@ -149,4 +158,26 @@ public boolean isSingleton() {
149158

150159
}
151160

161+
static class NonSingletonFactoryBean implements FactoryBean<ExampleService> {
162+
163+
private int getObjectInvocations = 0;
164+
165+
@Override
166+
public ExampleService getObject() {
167+
this.getObjectInvocations++;
168+
return mock(ExampleService.class, MockReset.before());
169+
}
170+
171+
@Override
172+
public Class<?> getObjectType() {
173+
return ExampleService.class;
174+
}
175+
176+
@Override
177+
public boolean isSingleton() {
178+
return false;
179+
}
180+
181+
}
182+
152183
}

0 commit comments

Comments
 (0)