日安。我的项目有一个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,这是条件所要求的。
2条答案
按热度按时间rta7y2nd1#
不要使用系统属性来配置数据库,而是让你的类更容易配置和测试。例如,您可以实现单例模式和初始化方法。
话虽如此,使用与测试不同的数据库进行生产可能无法重现确切的行为。
gz5pxeao2#
我知道您想为测试配置不同的数据源。这可以在没有任何代码的情况下完成,只需提供一个不同的
application.properties
文件。假设您的
application.properties
位于src/main/resources
中。复制一份并将其放入文件夹src/test/resources
中。在此文件中,可以修改测试的属性。只有通过测试才能发现它们。应用程序仍将使用原始文件。