Skip to content

Commit

Permalink
Hacking
Browse files Browse the repository at this point in the history
  • Loading branch information
mbhave committed Apr 21, 2020
1 parent 4e0fdbe commit d291928
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 6 deletions.
Expand Up @@ -247,9 +247,9 @@ private Set<String> getExistingBeans(ConfigurableListableBeanFactory beanFactory
}

private Set<String> getExistingBeans(ConfigurableListableBeanFactory beanFactory, ResolvableType type) {
Set<String> beans = new LinkedHashSet<>(Arrays.asList(beanFactory.getBeanNamesForType(type)));
Set<String> beans = new LinkedHashSet<>(Arrays.asList(beanFactory.getBeanNamesForType(type, true, false)));
String typeName = type.resolve(Object.class).getName();
for (String beanName : beanFactory.getBeanNamesForType(FactoryBean.class)) {
for (String beanName : beanFactory.getBeanNamesForType(FactoryBean.class, true, false)) {
beanName = BeanFactoryUtils.transformedBeanName(beanName);
BeanDefinition beanDefinition = beanFactory.getBeanDefinition(beanName);
if (typeName.equals(beanDefinition.getAttribute(FactoryBean.OBJECT_TYPE_ATTRIBUTE))) {
Expand Down
Expand Up @@ -16,11 +16,18 @@

package org.springframework.boot.test.mock.mockito;

import java.util.Map;

import org.junit.jupiter.api.Test;
import org.mockito.Mockito;

import org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.boot.test.mock.mockito.example.ExampleService;
import org.springframework.boot.test.mock.mockito.example.FailingExampleService;
Expand All @@ -29,6 +36,9 @@
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.Ordered;
import org.springframework.test.util.ReflectionTestUtils;
import org.springframework.util.Assert;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
Expand Down Expand Up @@ -123,6 +133,16 @@ void canSpyQualifiedBeanWithPrimaryBeanPresent() {
assertThat(Mockito.mockingDetails(context.getBean("exampleQualified", ExampleService.class)).isSpy()).isTrue();
}

@Test
void postProcessorShouldNotTriggerEarlyInitialization() {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.register(FactoryBeanRegisteringPostProcessor.class);
MockitoPostProcessor.register(context);
context.register(TestBeanFactoryPostProcessor.class);
context.register(EagerInitBean.class);
context.refresh();
}

@Configuration(proxyBeanMethods = false)
@MockBean(SomeInterface.class)
static class MockedFactoryBean {
Expand Down Expand Up @@ -258,21 +278,51 @@ ExampleService examplePrimary() {

}

@Configuration(proxyBeanMethods = false)
static class EagerInitBean {

@MockBean
private ExampleService service;

}

static class TestFactoryBean implements FactoryBean<Object> {

@Override
public Object getObject() {
return new TestBean();
return "hello";
}

@Override
public Class<?> getObjectType() {
return null;
return String.class;
}

};

static class FactoryBeanRegisteringPostProcessor implements BeanFactoryPostProcessor, Ordered {

@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
RootBeanDefinition beanDefinition = new RootBeanDefinition(TestFactoryBean.class);
((BeanDefinitionRegistry) beanFactory).registerBeanDefinition("test", beanDefinition);
}

@Override
public boolean isSingleton() {
return true;
public int getOrder() {
return Ordered.HIGHEST_PRECEDENCE;
}

}

static class TestBeanFactoryPostProcessor implements BeanFactoryPostProcessor {

@Override
@SuppressWarnings("unchecked")
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
Map<String, BeanWrapper> cache = (Map<String, BeanWrapper>) ReflectionTestUtils.getField(beanFactory,
"factoryBeanInstanceCache");
Assert.isTrue(cache.isEmpty(), "Early initialization of factory bean triggered.");
}

}
Expand Down

0 comments on commit d291928

Please sign in to comment.