在内存数据库中使用h2的JUnit在SQL中具有“ ARRAY”功能时不起作用

时间:2019-05-03 14:05:34

标签: java postgresql junit h2

我正在尝试使用h2在内存数据库中编写一些单元测试。生产中的数据库是一个PostgreSQL。因此,拥有一个postgresql数据库,该SQL包含“ ARRAY”功能。当我尝试使用h2对该SQL结果进行单元测试时,我收到“ ARRAY”功能不存在的错误。

SQL:

"select DISTINCT(R.id), T.id, T.authorid, T.authorname, T.enddate, T.operationType, R.imsicount, t.isallimsis,"
                    + "    array(select deviceip from wm_audit_device where audittrailid = T.id and success = true  ) as successdevices,"
                    + "    array(select deviceip from wm_audit_device where audittrailid = T.id and success = false  ) as faileddevices";

实际结果:

Caused by: org.h2.jdbc.JdbcSQLException: Function "ARRAY" not found; SQL statement:

有一种解决方法,可以继续测试此结果吗?

2 个答案:

答案 0 :(得分:1)

我有一个类似的问题,我必须在H2中测试一个if (message.content.startsWith(prefix + "info")) { message.delete(500) const userinfo = new Discord.RichEmbed() .setColor('#71ff33') .setTitle('') .setURL('') .setAuthor('User Information', 'http://www.stickpng.com/assets/images/585e4bf3cb11b227491c339a.png') .setDescription("Hey " + message.author.username + " here's the information you requested.") .setThumbnail(message.author.avatarURL) .addBlankField() .addField('**User:**', message.member.user, true) .addField('**Rank:**', message.member.highestRole, true) .addField('**Joined:**', message.member.joinedAt, true) .addField('**Premium:**', , true) //This is where I'm stuck at. .setImage() .addBlankField() .setTimestamp() .setFooter('Discord User Information' , message.author.avatarURL); message.channel.send(userinfo); }自定义函数。似乎我的解决方案的基础也适用于此用例。

将在https://www.javacodegeeks.com/2018/09/java-mocking-resultset-using-mockito.html处找到的MockResultSet类添加到测试类中。

使用返回postgresql的静态方法array创建实用程序类。

ResultSet

创建一个SQL脚本以向public class H2TestFunctionUtility { public static ResultSet array() { // build your mocked result here String[] columnNames = new String[] {"column", "names", "here"}; Object[][] rowValues = new Object[][] { {"values"}, {"go"}, {"here"}}; return MockResultSet.create(columnNames, rowValues); // } } 注册该函数

H2

用以下方法注释测试方法(或类,如果适用):

CREATE ALIAS array FOR "com.example.my.test.utility.package.TestUtility.array";

应该运行测试。

答案 1 :(得分:0)

也许考虑也使用提供PostgreSQLContainer的{​​{3}}。您可以使用与生产环境更加一致的配置,而不是在内存中使用H2。

您可以找到Testcontainers的用法示例。