Kotlin / Java – 测试数据库数据提供的REST API

我试图测试一个连接到我的数据库,并试图配置一个模拟数据库。 我只是不知道如何。 如何使用任何测试框架来模拟数据库并测试我的方法(如下所示) getUserById

由于这是使用原始jdbc,我怎样才能覆盖这个getConnection()方法使用模拟数据库,而不是真正的? 还是不是这样的路?

我还没有测试过API的数据库连接/输出,所以我不知道从哪里开始。

这是我的jdbc类:

 import java.sql.Connection import java.sql.DriverManager import java.sql.ResultSet import java.sql.Statement import java.util.ArrayList import java.util.Properties import bye.domain.* class jdbcTrial { val url: String = "jdbc:postgresql://196.21.2.12:5432/events" //val props: Properties = Properties(); val DB_DRIVER = "org.postgresql.Driver"; // used for getting the comments fun getUserById(id: Int): User { val query = "select * from user where id = ${id};"; return getSingleUser(query) } /* Singles */ fun getSingleUser(query: String): User { val conn = this.getConnection() var user = User() val statement: Statement = conn.createStatement() val rs: ResultSet = statement.executeQuery(query) while (rs.next()) { user = convertToUser(rs) } return user } /* Converting */ fun convertToUser(rs: ResultSet): User { val id = rs.getInt("id") val uname = rs.getString("username") val type = rs.getString("usertype") return User(id, uname, type) } fun getConnection(): Connection { Class.forName(DB_DRIVER).newInstance() val conn: Connection = DriverManager.getConnection(url, "username", "password") return conn } } 

在现实世界中,至少可以看到以下几种方式:

  1. 你不测试它。 代码很简单,db测试可能很贵,速度慢等
  2. 手动测试1个常见的远程安装实例。 非常没用,因为它不允许你(或使它非常困难)尝试更改模式,删除表,数据等
  3. 为测试使用内存中的数据库(H2,HLSQL等)。 它可以让你开始很容易,因为它启动和停止数据库的需求。 问题是:你仍然必须清除事务之间的数据库(如果你做事务测试,你可以使用像dbUnit这样的框架,或者完全控制并手动完成),事实上你不用测试你的数据库。 你测试一些其他的数据库
  4. 使用与生产数据库相同的数据库提供者。 这是最好的测试,但是需要在设置基础架构方面有一些想法:你必须启动你的d​​b进行测试(自动docker?手动启动?永久安装的本地/远程db?),你必须在每次测试之前准备db(schema,表格,初始数据,清除现有数据,重置序列等)并在测试后关闭。

我推荐最后一个使用:

  1. 在尝试连接到现有数据库的所有测试设置之前,如果没有数据库监听,那么它启动与该数据库泊坞窗
  2. 创建模式和数据库结构的flyway
  3. 测试设置,在每次测试之前清除所有数据,重置序列等
  4. 每个测试插入在测试期间将需要的数据
  5. jvm关闭挂钩,如果docker在开始时就停止