java 在单个方法中实现BeforeEach

bsxbgnwa  于 2023-05-21  发布在  Java
关注(0)|答案(2)|浏览(173)

日安。我的项目有一个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库用于为项目dao方法开发单元测试。已经创建了一个基类,在它的帮助下,用于连接到数据库的参数被重新定义(在本例中,连接到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属性在单个方法中被重新定义?重要的是,该方法的行为与@BeforeEach而不是@BeforeAll注解的行为相似。我尝试使用@BeforeEach而不是@BeforeAll,删除static,但当执行测试时,会访问postgress数据库,而不是H2,这是条件所要求的。

rta7y2nd

rta7y2nd1#

不要使用系统属性来配置数据库,而是让你的类更容易配置和测试。例如,您可以实现单例模式和初始化方法。
话虽如此,使用与测试不同的数据库进行生产可能无法重现确切的行为。

gz5pxeao

gz5pxeao2#

我知道您想为测试配置不同的数据源。这可以在没有任何代码的情况下完成,只需提供一个不同的application.properties文件。
假设您的application.properties位于src/main/resources中。复制一份并将其放入文件夹src/test/resources中。在此文件中,可以修改测试的属性。只有通过测试才能发现它们。应用程序仍将使用原始文件。

相关问题