在 Java 中,DAO(Data Access Object) 层负责与数据库交互,测试它的核心目标是:
✅ 验证 SQL 是否正确
✅ 验证 CRUD 逻辑是否正确
✅ 验证异常处理是否合理
下面从常见测试方式 → 示例代码 → 最佳实践给你一个完整说明。
特点
✅ 适合:
工具:
特点
✅ 适合:
特点
❌ 不推荐用于 DAO 本身
✅ 可用于 Service 层
@Repository
public class UserDao {
@Autowired
private JdbcTemplate jdbcTemplate;
public User findById(Long id) {
return jdbcTemplate.queryForObject(
"SELECT id, name FROM user WHERE id = ?",
(rs, row) -> new User(
rs.getLong("id"),
rs.getString("name")
),
id
);
}
public int insert(User user) {
return jdbcTemplate.update(
"INSERT INTO user(name) VALUES (?)",
user.getName()
);
}
}
@SpringBootTest
@Transactional // 测试后自动回滚
class UserDaoTest {
@Autowired
private UserDao userDao;
@Test
void testInsertAndFind() {
User user = new User(null, "Tom");
userDao.insert(user);
User result = userDao.findById(1L);
assertEquals("Tom", result.getName());
}
}
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>postgresql</artifactId>
<scope>test</scope>
</dependency>
@Container
static PostgreSQLContainer<?> postgres =
new PostgreSQLContainer<>("postgres:15");
@Test
void testRealDatabase() {
// 使用真实 PostgreSQL 测试 DAO
}
✅ 优点:
✅ 必测点:
❌ 不必测:
✅ DAO 层用 集成测试
✅ 用 @Transactional 自动回滚
✅ 优先 Testcontainers
✅ 不在 DAO 写业务逻辑
✅ Service 层再 Mock DAO
如果你用的是 MyBatis / JPA / Spring Data JDBC,可以告诉我,我可以给你对应框架的 DAO 测试模板。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。