我正在尝试测试与数据库的连接,并尝试配置模拟数据库。我不知道该怎么办。任何测试框架如何模拟数据库并测试我的方法(如下所示)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等)。它使您启动起来非常容易,因为它可以根据需要启动和停止数据库。问题是:您仍然必须在事务之间清除db(如果您进行事务测试。您可以使用dbUnit之类的框架或完全控制并手动进行操作),而实际上您无需测试数据库。你测试其他数据库
使用与生产数据库相同的数据库提供程序。这是最好的测试,但是在设置基础架构时需要一些思考:您必须启动数据库以进行测试(自动docker?手动启动?永久安装的本地/远程db?),您必须在每次测试之前准备数据库(模式,表,初始数据,清除现有数据,重置序列等),并在测试后将其关闭。
我建议使用的最后一个:
在尝试连接到现有数据库的所有测试设置之前,如果没有数据库在监听,则它将使用该数据库启动docker
创建架构和数据库结构的飞行路线
测试设置,可在每次测试之前清除所有数据,重置序列等
每个测试都会插入该测试期间所需的数据
jvm shutdown挂钩,可在开始时停止docker