我正在测试我们自己的库,它使用 JDBC。对于指定的数据库名称,代码需要查找值
javax.sql.DataSource
,使用 DataSource.getConnection()
连接,然后运行一些 SQL 语句。
如果环境中存在
$TESTDB
,我希望跳过所有测试。我还想单独测试这些初始步骤——例如,如果找到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
。
为什么我的订单不起作用?
你可能错过了:
@TestMethodOrder(OrderAnnotation.class)
在班级级别定义。