使用Mybatis和不同DB进行集成测试开发时如何做集成测试

Posted

技术标签:

【中文标题】使用Mybatis和不同DB进行集成测试开发时如何做集成测试【英文标题】:How to do integration testing when using Mybatis and different DB for Integration testing and development 【发布时间】:2018-06-25 07:52:34 【问题描述】:

我正在使用 MyBatis 开发我的应用程序。现在我偶然发现了 sql 查询应该返回最后插入的 id 给我的情况,

我使用 mysql 进行开发,使用 H2 DB 进行集成测试。

在 MySql 中,我们使用 last_insert_id() 函数来获取此 id,但在 H2 DB 中,我们使用 currval() 函数。即使我在 MySql 中使用序列,这种语法仍然会有所不同。

现在的问题是我应该如何编写集成测试代码。由于我为开发编写的相同查询用于集成测试。这种情况我该怎么办

【问题讨论】:

last_insert_id() 似乎是 MySQL 函数,而不是 Oracle。 对不起,我使用的是 mysql 而不是 oracle DB。不知道,因为我没有配置 Dbeaver 【参考方案1】:

您可以使用动态 SQL,基于任一数据库类型或您可用的其他变量(例如,具有当前配置文件的环境变量)。 文档中的一个示例:

<insert id="insert">
  <selectKey keyProperty="id" resultType="int" order="BEFORE">
    <if test="_databaseId == 'oracle'">
      select seq_users.nextval from dual
    </if>
    <if test="_databaseId == 'db2'">
      select nextval for seq_users from sysibm.sysdummy1"
    </if>
  </selectKey>
  insert into users values (#id, #name)
</insert>

请参阅documentation here。

【讨论】:

我认为应该在与数据库无关的代码上进行集成测试。我们的代码应该适用于这两个数据库。【参考方案2】:

如果您使用的是 Spring boot,您可以尝试将以下属性放入您的测试 application.properties 文件中。只有一行:

spring.datasource.url=jdbc:h2:mem:test;MODE=MySQL

关键字是 MODE=MySQL,对我有用。

【讨论】:

以上是关于使用Mybatis和不同DB进行集成测试开发时如何做集成测试的主要内容,如果未能解决你的问题,请参考以下文章

使用 MyBatis、H2 和 Oracle 程序进行集成测试

如何使用 Maven Surefire 插件与不同的组进行测试和集成测试?

SpringBoot集成mybatis以及自动化测试代码实现

Atitit.mybatis的测试  以及spring与mybatis在本项目中的集成配置说明

集成测试类型和最佳实践

Mybatis与Spring集成时都做了什么?