Java 集成测试DAO INSERT语句

Java 集成测试DAO INSERT语句,java,integration-testing,Java,Integration Testing,我需要对INSERT语句执行集成测试。 基本上,我需要一个自动测试,以确保在该查询中编写的SQL实际上是正确的。 我不确定如何编写这个集成测试 您需要考虑以下想法: 该方法执行一个fire-and-forget类型插入,因此对其进行单元测试是没有用的 我无法编写findById方法,因为该记录没有ID。在我的情况下,ID是无用的,因为这些记录永远不会被ID检索。此外,这将导致鸡和蛋的问题,因为findById或insert语句可能是错误的 我已经看到了一堆帖子,它们立即开始讨论单元测试。我不

我需要对INSERT语句执行集成测试。
基本上,我需要一个自动测试,以确保在该查询中编写的SQL实际上是正确的。
我不确定如何编写这个集成测试

您需要考虑以下想法:

  • 该方法执行一个fire-and-forget类型插入,因此对其进行单元测试是没有用的
  • 我无法编写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
如果该表不允许重复行:

  • 开始交易
  • 调用测试中的方法
  • 读取符合条件的行
  • 回滚发送
  • 已读取断言行

如果没有事务管理器,则需要手动清理:在运行insert函数之前和之后删除所需的行。

您需要编写代码,计算数据库中有多少行具有这些列值,在调用该方法之前和之后。@DawoodibnKareem那么您会同意我需要对find方法的依赖关系吗?无论如何,我看不到其他方法。我将通过直接向数据库发送SQL来测试这一点。