Estou testando nossa própria biblioteca, que usa JDBC. Para o nome do banco de dados especificado, o código precisa encontrar o valor javax.sql.DataSource
, conectar usando o DataSource.getConnection()
, e então executar algumas instruções SQL.
Gostaria que todos os testes fossem pulados, se houver mp $TESTDB
no ambiente. Eu também gostaria de testar essas etapas iniciais separadamente -- pulando o resto se, por exemplo, encontrar o dataSource
que falhou.
O código de teste até agora é:
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);
}
}
A @BeforeAll
anotação parece funcionar bem -- o método é invocado primeiro e registra o DBNAME obtido da variável de ambiente. Se a variável de ambiente não estiver definida, todos os testes serão ignorados, como eu quero.
Meu problema é que, apesar das @Order
anotações explícitas, o getConnection()
teste é tentado antes que o getDataSource()
teste tenha a chance de definir o static DS
. O getDataSource()
próprio é bem-sucedido -- depois, registrando algo como:
Datasource for SQL_DEV4: org.apache.commons.dbcp.BasicDataSource@4a3668
mas getConnection()
falha devido a uma exceção de ponteiro nulo, porque DS
ainda é null
, quando é tentado.
Por que meu pedido não está funcionando?