我正在尝试测试与数据库的连接并尝试配置模拟数据库。我只是不知道该怎么做。如何使用任何测试框架来模拟数据库并测试我的方法(如下所示)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 个常见远程安装实例进行手动测试。非常无用,因为它不允许您(或使其变得非常困难)尝试更改架构、删除表、数据等
- 测试时使用内存数据库(h2、hsql 等)。它让您可以非常轻松地启动,因为它可以按需启动和停止数据库。问题是:您仍然需要在事务之间清除数据库(如果您进行事务测试。您可以使用像 dbUnit 这样的框架或拥有完全控制权并手动执行),并且实际上您不测试您的数据库。你测试一些其他数据库
- 使用与生产数据库相同的数据库提供程序。这是最好的测试,但需要在设置基础设施时进行一些思考:您必须启动数据库进行测试(自动docker?手动启动?永久安装的本地/远程数据库?),您必须在每次测试之前准备数据库(模式,表、初始数据、清除现有数据、重置序列等)并在测试后关闭。
我推荐最后一个使用:
- 在尝试连接到现有数据库的所有测试设置之前,如果没有数据库监听,则它将使用该数据库启动 docker
- 创建架构和数据库结构的 Flyway
- 测试设置,在每次测试之前清除所有数据、重置序列等
- 每个测试都会插入该测试期间所需的数据
- jvm shutdown hook,如果 Docker 从一开始就启动,它会停止它
关于java - Kotlin/Java - 测试数据库数据提供的 REST API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39658016/