使用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以及自动化测试代码实现