You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:56:34