通过延迟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 blogrelated pull request.

谢谢 @rabiori 的实现