提问者:小点点

在单个方法中实现Before每一个


日安。我的项目有一个DataSource类,它实现了数据库连接参数,以及数据库连接的初始化:

public class DataSource {
    private static HikariConfig config = new HikariConfig();
    private static HikariDataSource ds;
 
    public static HikariDataSource getDataSource() {
        if (ds == null) {
            config.setJdbcUrl(System.getProperty("jdbcUrl","jdbc:postgresql://localhost:5433/postgres"));
            config.setUsername(System.getProperty("jdbcUser","postgres"));
            config.setPassword(System.getProperty("jdbcPassword","postgres"));
            ds = new HikariDataSource(config);
 
            initDatabase();
        }
        return ds;
    }
 
    private static void initDatabase() {
        try {
            DatabaseConnection connection = new JdbcConnection(ds.getConnection());
            Database database = DatabaseFactory.getInstance().findCorrectDatabaseImplementation(connection);
            Liquibase liquibase = new Liquibase(
                    System.getProperty("liquibaseFile","liquibase.xml"),
                    new ClassLoaderResourceAccessor(),
                    database);
            liquibase.update(new Contexts());
        } catch (SQLException | LiquibaseException e) {
            throw new RuntimeException(e);
        }
    }
 
    public static Connection getConnection() throws SQLException {
        return ds.getConnection();
    }
}

JUnit库用于为项目道方法开发单元测试。已经创建了一个基类,在该基类的帮助下,重新定义了连接到数据库的参数(在本例中,H2):

public class Base {
 
    @BeforeAll
    static void setup() {
        System.setProperty("jdbcUrl", "jdbc:h2:mem:test_" + UUID.randomUUID());
        System.setProperty("jdbcUser", "sa");
        System.setProperty("jdbcPassword", "");
        System.setProperty("liquibaseFile", "liquibase_test.xml");
    }
 
    @BeforeEach
    void init() {
        setup();
    }
}

如何确保System. setProperty属性在单个方法中被重新定义?重要的是方法的行为类似于@Before每一个而不是@BeforeAll注释。我尝试将@Before每一个而不是@BeforeAll,删除静态,但是当测试执行时,访问的是后置数据库,而不是H2,这是条件所要求的。


共2个答案

匿名用户

不要使用系统属性来配置数据库,而是使您的类易于配置和可测试。例如,您可以实现单例模式和初始化方法。

话虽如此,使用不同的数据库进行生产可能无法重现确切的行为。

匿名用户

我知道您想为测试配置不同的数据源。这可以在没有任何代码的情况下完成,只需提供一个不同的application.properties文件。

假设您的application.properties位于src/main/资源中。制作一份副本并将其放在文件夹src/test/资源中。在此文件中,您可以修改测试的属性。它们只能由测试找到。应用程序仍将使用原始文件。