应用正常但JUnit运行失败:找不到EntityManager合格Bean
这个问题的核心原因很清晰:你的业务应用启动时能自动触发Spring的JPA自动配置,而JUnit测试上下文只加载了你自定义的AppConfiguration,缺少了创建EntityManager所需的配置。
为什么业务应用能正常运行?
你的业务应用应该是通过@SpringBootApplication(或者包含@EnableAutoConfiguration的注解)启动的,这个注解会自动导入Spring Boot的JPA自动配置类(比如HibernateJpaAutoConfiguration)。这些自动配置类会帮你自动创建EntityManagerFactory,并提供可自动注入的EntityManager代理实例——这就是为什么你没显式定义EntityManager Bean,但应用里能正常@Autowired的原因。
为什么JUnit测试会报错?
你的测试类用@ContextConfiguration(classes=AppConfiguration.class)指定了只加载AppConfiguration,但这个配置类本身并没有定义EntityManager Bean,也没有触发JPA相关的自动配置。Spring容器找不到符合要求的EntityManager Bean,自然就抛出了NoSuchBeanDefinitionException。
解决方案
这里有两种常见的解决方式,你可以根据测试需求选择:
方案1:使用@SpringBootTest加载完整应用上下文
这是最简便的方式,适合需要完整应用上下文的集成测试。修改你的测试类:
@RunWith(SpringRunner.class) @SpringBootTest @TestPropertySource(locations = "classpath:application.properties") public class ControllerTest { @Autowired private CController controller; }
@SpringBootTest会自动加载@SpringBootApplication标注的启动类,触发所有自动配置,包括JPA相关的配置,这样EntityManager就会被正确创建并注入。
方案2:手动在测试上下文添加JPA配置(轻量测试场景)
如果你不想加载完整的应用上下文,只想测试特定组件,可以在测试配置中手动补充JPA相关的Bean定义:
- 先修改你的
AppConfiguration,不要直接@AutowiredEntityManager,而是通过EntityManagerFactory获取:
@Configuration @EnableTransactionManagement @EnableJpaRepositories(basePackages = "com.yourpackage.repository") // 替换为你的Repository包路径 @EntityScan(basePackages = "com.yourpackage.entity") // 替换为你的实体类包路径 public class AppConfiguration { @Autowired private EntityManagerFactory entityManagerFactory; @Bean public CustomRepository<Person> customRepository(){ return new CustomRepository<>(Person.class, entityManagerFactory.createEntityManager()); } // 手动配置测试用DataSource(以H2内存数据库为例) @Bean public DataSource dataSource() { return new EmbeddedDatabaseBuilder() .setType(EmbeddedDatabaseType.H2) .build(); } @Bean public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) { LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); em.setDataSource(dataSource); em.setPackagesToScan("com.yourpackage.entity"); // 实体类包路径 em.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); // 添加JPA属性配置(比如Hibernate的DDL策略) Properties properties = new Properties(); properties.setProperty("hibernate.hbm2ddl.auto", "create-drop"); em.setJpaProperties(properties); return em; } }
- 测试类保持原来的
@ContextConfiguration即可,此时Spring容器会根据你手动配置的Bean创建EntityManager。
这样就能解决测试时找不到EntityManager Bean的问题了。
内容的提问来源于stack exchange,提问作者DBreaker

