我正在尝试使用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:
有一种解决方法,可以继续测试此结果吗?
答案 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的用法示例。