Я немного борюсь, чтобы понять преимущество использования ExternalResource
. documentation и другие сообщения (How Junit @Rule works?) все ссылаются на возможность обмена кодами между тестами внутри класса и/или общего кода между тестовыми классами.Как передать ExternalResource между двумя тестовыми классами?
Я пытаюсь использовать ExternalResource
для соединения с БД в тесте функциональности/интеграции, но я не вижу, как я могу поделиться этим соединением между классами. На самом деле, я не вижу в этом случае преимущества над @Before/@After
. Я использую это неправильно или что мне не хватает?
public class some_IntegrationTest {
private static String id;
Connection connection = null;
//...
@Rule
public ExternalResource DBConnectionResource = new ExternalResource() {
@Override
protected void before() throws SQLException {
connection = DbUtil.openConnection();
}
@Override
protected void after() {
DbUtil.closeConnection(connection);
}
};
@BeforeClass
public static void setUpClass() throws SQLException {
System.out.println("@BeforeClass setUpClass");
cleanup(id);
}
//I want to do something like this
@Test
public void test01() {
cleanupData(connection, id);
// do stuff...
}
@Test
public void test02() {
cleanupTnxLog(connection, id);
// do stuff...
}
//...
private static void cleanup(String id) throws SQLException {
LOGGER.info("Cleaning up records");
Connection connection = null;
try {
connection = DbUtil.openConnection();
cleanupData(connection, id);
cleanupTnxLog(connection, id);
} finally {
DbUtil.closeConnection(connection);
}
}
private static void cleanupData(Connection connection, String id)
throws SQLException {
dao1.delete(connection, id);
}
private static void cleanupTnxLog(Connection connection, String id)
throws SQLException {
dao2.delete(connection, id);
}
}
Идея ресурсов заключается в иметь что-то самодостаточное (например, запустить веб-сервер before() и остановить его после()) –
@RC. Я действительно не хочу делиться объектом «Connection» между тестовыми классами. Но я не вижу, как я могу избежать копирования одного и того же правила во все остальные классы. В документе указывается, что «ExternalResource является базовым классом для правил (например, TemporaryFolder), которые устанавливают внешний ресурс перед тестированием (файл, сокет, сервер, соединение с базой данных и т. Д.) И гарантируют его срыв после этого», поэтому Я предположил, что могу использовать его для подключения к базе данных. – user1766760
Я не понимаю, почему вы не можете использовать правило здесь. –