How to prevent spring boot from auto creating instance of bean 'entityManagerFactory' at startup?

10,815

You can disable auto configuration in spring-boot using exclude attribute of @EnableAutoConfiguration, as follows:

@Configuration
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
public class TestConfig {
}

From @EnableAutoConfiguration documentation:

If the class is not on the classpath, you can use the excludeName attribute of the annotation and specify the fully qualified name instead. Finally, you can also control the list of auto-configuration classes to exclude via the spring.autoconfigure.exclude property.

Share:
10,815
rmulay
Author by

rmulay

Updated on June 26, 2022

Comments

  • rmulay
    rmulay almost 2 years

    I am working on a Spring boot application that uses Spring JPA with PostgreSQL. I am using @SpringBootTest(classes = <my package>.Application.class) to initialize my unit test for a controller class.

    The problem is that this is causing the entityManagerFactory bean (and many other objects related to jpa, datasource, jdbc, etc.) to be created which is not needed for unit tests. Is there a way to prevent Spring from automatically creating these objects till they are actually used the first time?

    I spent a lot of time trying to load up only the beans I need for my unit test but ran into many errors. I am relatively new to Spring and I am hoping someone else has run into this before...and can help. I can post code snippets if needed.

    Update: I am not sure if I should edit or answer my own question...choosing to edit since I ended up changing my approach to unit tests. I added this to my test config class.

      @Configuration
      @ComponentScan(basePackages = {"api.controller", "api.config", "api.utils"})
      public class TestControllerConfig {
      }
    

    and I mocked out the service and repository classes.

  • rmulay
    rmulay over 7 years
    I added a config class, TestControllerConfig, as suggested by you above. Then I modified my test class as shown below. The datasource and JPA beans still get created. And if I remove the @SpringBootTest annotation, I start getting errors (NoSuchBeanDefinitionException) for every bean I need for my test to work. @RunWith(SpringRunner.class) @SpringBootTest(classes = com.tgt.merch.eno.transferorder.api.Application.class) @ContextConfiguration(classes = com.tgt.merch.test.controller.config.TestControllerConfig.cl‌​ass) @AutoConfigureMockMvc public class HealthControllerTest {
  • rmulay
    rmulay about 7 years
    Since you have answered my original question and it makes sense to me, I am going to accept it even though I solved my issue a different way. I am new to posting in SO so I am hoping it is ok to do this.
  • Arpit Aggarwal
    Arpit Aggarwal about 7 years
    @rmulay it's good if you share how you fixed it, will be helpful for future readers.
  • rmulay
    rmulay about 7 years
    I updated my original question with how I fixed it. Do you think I should add more details if it is not clear.