我需要对 INSERT 语句执行集成测试。
基本上,我想要一个自动化测试来确保该查询中编写的 SQL 实际上是正确的。
我不确定如何编写这个集成测试。
您需要考虑以下想法:
- 该方法执行“即发即忘”类型的 INSERT,因此单元测试在我看来没有用处。
- 我无法编写 findById 方法,因为记录没有 ID。 id 在我的例子中是没有用的,因为这些记录永远不会通过 id 检索到。而且,这会导致先有鸡还是先有蛋的问题,因为 findById 或 insert 语句都可能是错误的。
我看过很多立即开始讨论单元测试的帖子。我不想对此进行单元测试,我想编写一个集成测试来确保我的 SQL 查询是正确的。
我不是在寻找特定的代码,我正在寻找正确的概念方法来测试代码中执行的 sql 查询(在我的例子中它恰好是 Java)。
你能给我一些建议吗?
代码:
public void insertPostStat(PostStat postStat) {
final String sql = "INSERT INTO post_stat(created_at, geom, google_place_id, google_place_name) " +
"VALUES(?, ST_SetSRID(ST_MakePoint(? , ? ), 4326), ?, ?";
KeyHolder holder = new GeneratedKeyHolder();
SqlParameterSource param = new MapSqlParameterSource()
.addValue("created_at", postStat.getCreatedAtMs())
.addValue("longitude", postStat.getLongitude())
.addValue("latitude", postStat.getLatitutde())
.addValue("google_place_id", postStat.getGooglePlaceId())
.addValue("google_place_name", postStat.getGooglePlaceName());
template.update(sql,param, holder);
}
最佳答案
通常,测试插入涉及尝试读回数据以确保其按预期写入。如果没有自然键,您始终可以选择所有列。如果表允许重复行,您应该先对它们进行计数:
- 开始交易
- 选择符合条件的行数。
- 调用正在测试的方法
- 选择符合条件的行数
- 回滚交易
- 断言 count2 - count1 = 1
如果表不允许重复行:
- 开始交易
- 调用正在测试的方法
- 读取符合条件的行
- 回滚交易
- 断言行已被读取
如果您没有事务管理器,则需要手动清理:在运行插入函数之前和之后删除预期的行。
关于java - 集成测试 DAO INSERT 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54873130/