使用 @datajpatest 测试 repository 时,spring boot 会自动配置一个内存数据库(默认 h2)并扫描 @entity 类,同时只加载 repository bean。你需要将测试类放在与实体包同级或子级目录下,确保 spring 能扫描到它们,并在测试方法中直接注入 repository 进行 crud 操作验证。

如何配置自动扫描实体和 Repository
必须确保测试类的包结构包含实体类和 Repository 接口,或者通过 @EntityScan 和 @EnableJpaRepositories 显式指定路径。这样 @DataJpaTest 才能找到需要管理的 Bean,否则注入时会报错。

package com.example.demo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import com.example.demo.entity.User;
import com.example.demo.repository.UserRepository;
import static org.assertj.core.api.Assertions.assertThat;
@DataJpaTest
public class UserRepositoryTest {
@Autowired
private UserRepository userRepository;
@Test
public void whenSaveUser_thenShouldReturnId() {
User user = new User();
user.setName("Alice");
user.setEmail("alice@example.com");
User saved = userRepository.save(user);
assertThat(saved.getId()).isNotNull();
assertThat(saved.getName()).isEqualTo("Alice");
}
}
如何验证自定义查询方法
对于自定义的 JPQL 或原生 SQL 查询,同样在 @DataJpaTest 环境下运行。你可以插入测试数据后调用自定义方法,断言返回结果是否符合预期。注意事务默认回滚,无需手动清理数据。

package com.example.demo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import com.example.demo.entity.User;
import com.example.demo.repository.UserRepository;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
@DataJpaTest
public class UserRepositoryCustomQueryTest {
@Autowired
private UserRepository userRepository;
@Test
public void whenFindByName_thenShouldReturnList() {
User user1 = new User();
user1.setName("Bob");
user1.setEmail("bob@example.com");
userRepository.save(user1);
List<user> result = userRepository.findByName("Bob");
assertThat(result).hasSize(1);
assertThat(result.get(0).getEmail()).isEqualTo("bob@example.com");
}
}</user>
测试时数据库连接是如何建立的
@DataJpaTest 默认使用嵌入式的 H2 数据库,并在内存中创建 schema。它不会连接你的生产数据库,而是根据 persistence.xml 或 application.properties 中的 JPA 配置生成临时表。测试结束后,内存数据库销毁,所有数据自动清除。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











