Spring Boot 2.0中Spring Data JPA Repository测试遇EntityManagerFactory缺失错误
解决Spring Boot 2.0 @DataJpaTest中找不到EntityManagerFactory的问题
我之前在做Spring Boot JPA测试的时候也碰到过一模一样的错误,咱们来一步步排查解决:
首先理清楚你的场景:你有一个继承JpaRepository的UserRepository,主应用类用了@SpringBootApplication,测试类搭配@RunWith(SpringRunner.class)和@DataJpaTest,但运行测试时提示找不到EntityManagerFactory的bean。
可能的原因和对应的解决方案:
1. 实体类没有被Spring扫描到
这是最常见的问题。@DataJpaTest依赖Spring能扫描到你的User实体类,才能创建EntityManagerFactory。
- 先检查包结构:如果主应用类
PhoneBookApplication在com.phonebook包下,那么User实体最好放在com.phonebook.entity这类子包中,测试类放在com.phonebook.repository子包下,这样默认的组件扫描就能覆盖到。 - 如果实体类不在主类的扫描范围内,你可以在主类上显式指定扫描包:
@SpringBootApplication(scanBasePackages = "com.phonebook") @EntityScan(basePackages = "com.phonebook.entity") // 专门指定实体类所在包 public class PhoneBookApplication { public static void main(String[] args) { SpringApplication.run(PhoneBookApplication.class, args); } }
或者直接在测试类上添加@EntityScan:
@RunWith(SpringRunner.class) @DataJpaTest @EntityScan(basePackages = "com.phonebook.entity") // 替换成你的实体类实际所在包 public class ProxyUserRepositoryTest { // ... 测试代码 }
2. 缺少必要的依赖
确保你的构建文件(Maven的pom.xml或Gradle的build.gradle)里包含了正确的依赖:
- 必须有
spring-boot-starter-data-jpa来支持JPA功能 - 测试依赖
spring-boot-starter-test不能少 - 测试时建议用内存数据库(比如H2),避免依赖外部数据库
Maven示例:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <!-- 测试依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- H2内存数据库,用于测试 --> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>test</scope> </dependency> </dependencies>
3. User实体类的注解不完整
JPA要求实体类必须标注@Entity,并且要有一个@Id注解的主键字段。检查你的User类:
@Entity // 必须添加这个注解,标识为JPA实体 public class User { @Id // 主键注解,不可缺少 @GeneratedValue(strategy = GenerationType.IDENTITY) // 可选,根据你的主键生成策略调整 private Integer id; private String fullName; private String password; private String userName; // 别忘了添加getter和setter方法 }
如果缺少@Entity或者@Id,Spring无法识别这个类为JPA实体,自然创建不了EntityManagerFactory。
4. 测试环境的数据库配置问题
@DataJpaTest默认会自动配置内存数据库,但如果你的application.properties(或application.yml)里指定了其他数据库,而测试环境没有对应的配置,也会出问题。你可以在src/test/resources下单独创建测试用的配置文件:
# src/test/resources/application.properties spring.datasource.url=jdbc:h2:mem:testdb spring.datasource.driverClassName=org.h2.Driver spring.datasource.username=sa spring.datasource.password= spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
按照上面的步骤排查,应该就能解决这个找不到EntityManagerFactory的问题了。
内容的提问来源于stack exchange,提问作者Andr1i
相关产品推荐
相关产品推荐

