java - 集成测试 DAO INSERT 语句

标签 java integration-testing

我需要对 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/

相关文章:

go - 如何将 stripe-go 指向 stripe-mock 本地服务器?

java - 平滑绘制的线条(类似铅笔的工具)java

java - 在JAVA中隐藏加密 key AES-256

java - 与 arquillian 的 EAR 集成测试

unit-testing - 将数据库加载到内存中

tfs - 我可以让 TFS 在不同的服务器上部署和执行测试吗?

java - JMX MBeanInfo 和描述符

java - Java中如何获取for循环的最后一个值?

java - 试图调用一个不存在的方法...纠正类路径

javascript - 如何从 rspec 集成测试中获取 nyc/istanbul JavaScript 覆盖率