我正在尝试测试与数据库的连接,并尝试配置模拟数据库。我不知道该怎么办。任何测试框架如何模拟数据库并测试我的方法(如下所示)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

08-18 09:42
查看更多