我正在测试我们自己的使用 JDBC 的库。对于指定的数据库名称,代码需要找到值javax.sql.DataSource
,使用连接DataSource.getConnection()
,然后运行一些 SQL 语句。
$TESTDB
如果环境中有 mp,我希望跳过所有测试。我还想单独测试那些初始步骤——例如,如果发现失败,则跳过其余步骤dataSource
。
到目前为止的测试代码是:
public static final String DBNAME = System.getenv("TESTDB");
private static DataSource DS = null;
private static Connection CONN = null;
@BeforeAll
public static void checkEnvironment() {
assumeTrue(DBNAME != null, "Environment variable DBNAME");
logger.info("DBNAME is {}", DBNAME);
}
@Test
@Order(20)
public void getDataSource() {
DS = DatasourceFactory.getDataSourceByKey(DBNAME);
assertNotNull(DS, "Failed to find details for datasource " +
DBNAME);
logger.info("Datasource for {}: {}", DBNAME, DS);
}
@Test
@Order(30)
public void getConnection() {
try {
CONN = DS.getConnection();
} catch (SQLException e) {
fail("Connetion to " + DBNAME + " failed", e);
}
}
注释@BeforeAll
似乎工作正常——首先调用该方法,并记录从环境变量获取的 DBNAME。如果未设置环境变量,则所有测试都会跳过,正如我所希望的那样。
我的问题是,尽管有明确的@Order
注释,但在测试有机会设置静态getConnection()
之前尝试进行测试。本身成功了——稍后,记录如下内容:getDataSource()
DS
getDataSource()
Datasource for SQL_DEV4: org.apache.commons.dbcp.BasicDataSource@4a3668
但是当尝试时,getConnection()
由于空指针异常而失败,因为DS
仍然是。null
为何我的订购不起作用?