Browse Source

Polish "Check for Class and ResolvableType object type attributes"

See gh-36224
pull/36620/head
Andy Wilkinson 2 years ago
parent
commit
f4c996b432
  1. 21
      spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/mock/mockito/MockitoPostProcessor.java
  2. 6
      spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/mock/mockito/MockitoPostProcessorTests.java

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

@ -248,29 +248,22 @@ public class MockitoPostProcessor implements InstantiationAwareBeanPostProcessor
return candidates; return candidates;
} }
private Set<String> getExistingBeans(ConfigurableListableBeanFactory beanFactory, ResolvableType type) { private Set<String> getExistingBeans(ConfigurableListableBeanFactory beanFactory, ResolvableType resolvableType) {
Set<String> beans = new LinkedHashSet<>(Arrays.asList(beanFactory.getBeanNamesForType(type, true, false))); Set<String> beans = new LinkedHashSet<>(
String typeName = type.resolve(Object.class).getName(); Arrays.asList(beanFactory.getBeanNamesForType(resolvableType, true, false)));
Class<?> type = resolvableType.resolve(Object.class);
String typeName = type.getName();
for (String beanName : beanFactory.getBeanNamesForType(FactoryBean.class, true, false)) { for (String beanName : beanFactory.getBeanNamesForType(FactoryBean.class, true, false)) {
beanName = BeanFactoryUtils.transformedBeanName(beanName); beanName = BeanFactoryUtils.transformedBeanName(beanName);
BeanDefinition beanDefinition = beanFactory.getBeanDefinition(beanName); BeanDefinition beanDefinition = beanFactory.getBeanDefinition(beanName);
Object attribute = beanDefinition.getAttribute(FactoryBean.OBJECT_TYPE_ATTRIBUTE); Object attribute = beanDefinition.getAttribute(FactoryBean.OBJECT_TYPE_ATTRIBUTE);
if(attribute instanceof Class) { if (resolvableType.equals(attribute) || type.equals(attribute) || typeName.equals(attribute)) {
Class<?> attributeClass = (Class<?>) attribute;
if (typeName.equals(attributeClass.getName())) {
beans.add(beanName);
}
} else if (attribute instanceof ResolvableType) {
ResolvableType resolvableType = (ResolvableType) attribute;
if (typeName.equals(resolvableType.resolve(Object.class).getName())) {
beans.add(beanName);
}
} else if (typeName.equals(attribute)){
beans.add(beanName); beans.add(beanName);
} }
} }
beans.removeIf(this::isScopedTarget); beans.removeIf(this::isScopedTarget);
return beans; return beans;
} }
private boolean isScopedTarget(String beanName) { private boolean isScopedTarget(String beanName) {

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

@ -74,7 +74,7 @@ class MockitoPostProcessorTests {
} }
@Test @Test
void canMockBeanProducedByFactoryBeanWithObjectTypeAttribute() { void canMockBeanProducedByFactoryBeanWithStringObjectTypeAttribute() {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
MockitoPostProcessor.register(context); MockitoPostProcessor.register(context);
RootBeanDefinition factoryBeanDefinition = new RootBeanDefinition(TestFactoryBean.class); RootBeanDefinition factoryBeanDefinition = new RootBeanDefinition(TestFactoryBean.class);
@ -86,7 +86,7 @@ class MockitoPostProcessorTests {
} }
@Test @Test
void canMockBeanProducedByFactoryBeanWithClassAttribute() { void canMockBeanProducedByFactoryBeanWithClassObjectTypeAttribute() {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
MockitoPostProcessor.register(context); MockitoPostProcessor.register(context);
RootBeanDefinition factoryBeanDefinition = new RootBeanDefinition(TestFactoryBean.class); RootBeanDefinition factoryBeanDefinition = new RootBeanDefinition(TestFactoryBean.class);
@ -98,7 +98,7 @@ class MockitoPostProcessorTests {
} }
@Test @Test
void canMockBeanProducedByFactoryBeanWithResolvableTypeAttribute() { void canMockBeanProducedByFactoryBeanWithResolvableTypeObjectTypeAttribute() {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
MockitoPostProcessor.register(context); MockitoPostProcessor.register(context);
RootBeanDefinition factoryBeanDefinition = new RootBeanDefinition(TestFactoryBean.class); RootBeanDefinition factoryBeanDefinition = new RootBeanDefinition(TestFactoryBean.class);

Loading…
Cancel
Save