Skip to main content

Increase integration test performance by lazy bean initialization

Tip submitted by @atomfrede

In many spring integration tests you don't need all beans, therefore initialization of all beans in the context for e.g. a repository test is not required and consumes precious time.

You can configure your tests to initialize beans lazy, such that only required beans are create by creating a class TestLazyBeanInitConfiguration in src/test/java/YOUR-PACKAGE/config with the following content:

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));
}
}

If you want/need a test to initialize all beans eagerly you need to annotate this test with @ActiveProfiles(TestLazyBeanInitConfiguration.EAGER_BEAN_INIT).

For reference look at spring boot blog and the related pull request.

Thanks to @rabiori for the implementation.