在集成测试中,您可以使用的另一个技巧是强制将上下文中的所有bean设置为“懒加载”。这在运行单个集成测试时非常有用,因为您不必等待整个应用程序上下文加载和初始化。这可以显着提高单个测试运行所需的时间。
您可能会遇到隐式创建bean的情况(例如:Spring IntegrationFlow)。该流程从未直接注入任何内容,但您的类可能引用了流程创建的bean。在这种情况下,您需要@Autowire您的流程(以确保隐式bean被创建),或者您可以使用BeanPostProcessor进行创意处理。
我创建了以下后处理器,您只需将其添加到测试spring上下文中即可。
public class LazyInitBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
private Class<?>[] exclusionList;
public LazyInitBeanFactoryPostProcessor() {
}
public LazyInitBeanFactoryPostProcessor(Class<?>[] exclusionList) {
this.exclusionList = exclusionList;
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
for (String beanName : beanFactory.getBeanDefinitionNames()) {
if (isLazy(beanName, beanFactory)) {
BeanDefinition definition = beanFactory.getBeanDefinition(beanName);
definition.setLazyInit(true);
}
}
}
private boolean isLazy(String beanName, ConfigurableListableBeanFactory beanFactory) {
if (exclusionList == null || exclusionList.length == 0) {
return true;
}
for (Class<?> clazz : exclusionList) {
if (beanFactory.isTypeMatch(beanName,clazz)) {
return false;
}
}
return true;
}
}
使用方法:
@SpringBootTest(webEnvironment = WebEnvironment.NONE)
public class MyTest {
.
.
.
@TestConfiguration
protected static class TestConfiguration {
@Bean
public BeanFactoryPostProcessor lazyBeanPostProcessor() {
return new LazyInitBeanFactoryPostProcessor();
}
}
或者您可以通过“排除”方式来扩展它(在这个例子中,任何可分配给Spring Integration流的bean将不会被标记为延迟加载:
@TestConfiguration
protected static class TestConfiguration {
@Bean
public BeanFactoryPostProcessor lazyBeanPostProcessor() {
return new ExtendedTestLazyBeanFactoryPostProcessor();
}
static private class ExtendedTestLazyBeanFactoryPostProcessor extends LazyInitBeanFactoryPostProcessor {
public ServiceTestLazyBeanFactoryPostProcessor() {
super(new Class<?>[] {IntegrationFlow.class});
}
}