通过延迟bean初始化来提高集成测试性能
提交者 @atomfrede
在许多Spring集成测试中,您不需要所有bean,因此可以在context中初始化所有bean,例如:不需要进行repository测试,这会浪费宝贵的时间。
您可以将测试配置为延迟初始化bean,这样可以通过在src/test/java/YOUR-PACKAGE/config
中创建类TestLazyBeanInitConfiguration
来创建仅必需的bean,其内容如下:
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component;
import java.util.Arrays;
@Component
@Profile("!" + TestLazyBeanInitConfiguration.EAGER_BEAN_INIT)
public class TestLazyBeanInitConfiguration implements BeanFactoryPostProcessor {
public static final String EAGER_BEAN_INIT = "eager-bean-init";
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
Arrays.stream(beanFactory.getBeanDefinitionNames())
.map(beanFactory::getBeanDefinition)
.forEach(beanDefinition -> beanDefinition.setLazyInit(true));
}
}
如果您希望或者需要一个测试来初始化所有bean,则需要使用@ActiveProfiles(TestLazyBeanInitConfiguration.EAGER_BEAN_INIT)
注解该测试。
可参考 spring boot blog 和 related pull request.
谢谢 @rabiori 的实现