Skip to content

Commit 3a71852

Browse files
bbulgarelliwilkinsona
authored andcommitted
Check for Class and ResolvableType object type attributes
See gh-36224
1 parent fe08c70 commit 3a71852

File tree

2 files changed

+38
-1
lines changed

2 files changed

+38
-1
lines changed

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

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,18 @@ private Set<String> getExistingBeans(ConfigurableListableBeanFactory beanFactory
254254
for (String beanName : beanFactory.getBeanNamesForType(FactoryBean.class, true, false)) {
255255
beanName = BeanFactoryUtils.transformedBeanName(beanName);
256256
BeanDefinition beanDefinition = beanFactory.getBeanDefinition(beanName);
257-
if (typeName.equals(beanDefinition.getAttribute(FactoryBean.OBJECT_TYPE_ATTRIBUTE))) {
257+
Object attribute = beanDefinition.getAttribute(FactoryBean.OBJECT_TYPE_ATTRIBUTE);
258+
if(attribute instanceof Class) {
259+
Class<?> attributeClass = (Class<?>) attribute;
260+
if (typeName.equals(attributeClass.getName())) {
261+
beans.add(beanName);
262+
}
263+
} else if (attribute instanceof ResolvableType) {
264+
ResolvableType resolvableType = (ResolvableType) attribute;
265+
if (typeName.equals(resolvableType.resolve(Object.class).getName())) {
266+
beans.add(beanName);
267+
}
268+
} else if (typeName.equals(attribute)){
258269
beans.add(beanName);
259270
}
260271
}

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

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import org.springframework.context.annotation.Configuration;
3737
import org.springframework.context.annotation.Primary;
3838
import org.springframework.core.Ordered;
39+
import org.springframework.core.ResolvableType;
3940
import org.springframework.test.util.ReflectionTestUtils;
4041
import org.springframework.util.Assert;
4142

@@ -84,6 +85,31 @@ void canMockBeanProducedByFactoryBeanWithObjectTypeAttribute() {
8485
assertThat(Mockito.mockingDetails(context.getBean("beanToBeMocked")).isMock()).isTrue();
8586
}
8687

88+
@Test
89+
void canMockBeanProducedByFactoryBeanWithClassAttribute() {
90+
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
91+
MockitoPostProcessor.register(context);
92+
RootBeanDefinition factoryBeanDefinition = new RootBeanDefinition(TestFactoryBean.class);
93+
factoryBeanDefinition.setAttribute(FactoryBean.OBJECT_TYPE_ATTRIBUTE, SomeInterface.class);
94+
context.registerBeanDefinition("beanToBeMocked", factoryBeanDefinition);
95+
context.register(MockedFactoryBean.class);
96+
context.refresh();
97+
assertThat(Mockito.mockingDetails(context.getBean("beanToBeMocked")).isMock()).isTrue();
98+
}
99+
100+
@Test
101+
void canMockBeanProducedByFactoryBeanWithResolvableTypeAttribute() {
102+
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
103+
MockitoPostProcessor.register(context);
104+
RootBeanDefinition factoryBeanDefinition = new RootBeanDefinition(TestFactoryBean.class);
105+
ResolvableType objectType = ResolvableType.forClass(SomeInterface.class);
106+
factoryBeanDefinition.setAttribute(FactoryBean.OBJECT_TYPE_ATTRIBUTE, objectType);
107+
context.registerBeanDefinition("beanToBeMocked", factoryBeanDefinition);
108+
context.register(MockedFactoryBean.class);
109+
context.refresh();
110+
assertThat(Mockito.mockingDetails(context.getBean("beanToBeMocked")).isMock()).isTrue();
111+
}
112+
87113
@Test
88114
void canMockPrimaryBean() {
89115
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();

0 commit comments

Comments
 (0)