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

标签 java unit-testing jdbc mocking kotlin

我正在尝试测试与数据库的连接并尝试配置模拟数据库。我只是不知道该怎么做。如何使用任何测试框架来模拟数据库并测试我的方法(如下所示)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. 你没有测试它。代码很简单,数据库测试可能很昂贵、很慢等
  2. 对 1 个常见远程安装实例进行手动测试。非常无用,因为它不允许您(或使其变得非常困难)尝试更改架构、删除表、数据等
  3. 测试时使用内存数据库(h2、hsql 等)。它让您可以非常轻松地启动,因为它可以按需启动和停止数据库。问题是:您仍然需要在事务之间清除数据库(如果您进行事务测试。您可以使用像 dbUnit 这样的框架或拥有完全控制权并手动执行),并且实际上您不测试您的数据库。你测试一些其他数据库
  4. 使用与生产数据库相同的数据库提供程序。这是最好的测试,但需要在设置基础设施时进行一些思考:您必须启动数据库进行测试(自动docker?手动启动?永久安装的本地/远程数据库?),您必须在每次测试之前准备数据库(模式,表、初始数据、清除现有数据、重置序列等)并在测试后关闭。

我推荐最后一个使用:

  1. 在尝试连接到现有数据库的所有测试设置之前,如果没有数据库监听,则它将使用该数据库启动 docker
  2. 创建架构和数据库结构的 Flyway
  3. 测试设置,在每次测试之前清除所有数据、重置序列等
  4. 每个测试都会插入该测试期间所需的数据
  5. jvm shutdown hook,如果 Docker 从一开始就启动,它会停止它

关于java - Kotlin/Java - 测试数据库数据提供的 REST API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39658016/

相关文章:

java - 如何正确使用抽象类/接口(interface)?

java - 时间只显示一种颜色

c# - 有没有办法使用带有可选参数的 NUnit TestCase 属性

java - 如果数据库行不存在,如何插入?

java - 如何通过java代码执行Oracle sql脚本

java - 如何使用 jackson 解析具有可变数量的第二个分数的 RFC3339 时间戳

Java版本升级至8

c++ - 是否可以使用预处理器或编译器从头文件创建 stub ?

database - Mock 框架可以为我做这个吗?

Java - JDBC 插入批量状态 -2 但记录存在于数据库中