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