在 JUnit 5 测试类之间共享数据库连接

Posted

技术标签:

【中文标题】在 JUnit 5 测试类之间共享数据库连接【英文标题】:Share database connection between JUnit 5 test classes 【发布时间】:2021-03-01 05:39:28 【问题描述】:

我在不同的测试包中有 6 个 JUnit 类。我想使用 Spring 框架使用的 application.properties 文件来设置数据库连接。

问题是如何在第一个 JUnit 测试运行时创建数据库连接并将其重用于所有类。最后正确关闭连接。

【问题讨论】:

【参考方案1】:

您可以为此使用Testcontainers。如果您想重用现有的数据库容器(例如 PostgreSQL 或 mysql),请确保使用手动容器生命周期方法并启动容器一次(例如在抽象测试类中)。测试容器调用这个Singleton containers:

abstract class AbstractContainerBaseTest 

    static final MySQLContainer MY_SQL_CONTAINER;

    static 
        MY_SQL_CONTAINER = new MySQLContainer();
        MY_SQL_CONTAINER.start();
    


class FirstTest extends AbstractContainerBaseTest 

    @Test
    void someTestMethod() 
        String url = MY_SQL_CONTAINER.getJdbcUrl();

        // create a connection and run test as normal
    

一旦您的 JVM 终止,您的容器将被删除。

另一种方法是reuse feature of Testcontainers:

static PostgreSQLContainer postgreSQLContainer = (PostgreSQLContainer) new PostgreSQLContainer()
  .withDatabaseName("test")
  .withUsername("duke")
  .withPassword("s3cret")
  .withReuse(true);

如果您的所有测试的数据库设置都相似,并且您选择加入此功能,则 Testcontainers 将重用已启动的容器。请记住,使用这种方法时,您必须自己清理容器,因为它们在所有测试完成后仍然活着

【讨论】:

很遗憾我正在为这个数据库使用 MSSQL 服务器? 没问题,Testcontainers也有MSSQL module。

以上是关于在 JUnit 5 测试类之间共享数据库连接的主要内容,如果未能解决你的问题,请参考以下文章

如何编写单元测试 (JUnit) 以使用 DAO 类检查数据库连接?

mybatis 通过配置父类数据源连接和关闭数据,进行junit单元测试

JUnit代码测试是啥?怎么写代码?

JUnit代码测试是啥?怎么写代码?

在 Junit 5 中,如何从扩展中调用测试类方法?

JUnit