Если вы используете DbUnit в модульных тестах, вы можете указать, что DbUnit должен выполнять операцию очистки и вставки перед каждым тестом, чтобы убедиться, что содержимое базы данных находится в допустимом состоянии перед каждым тестовое задание. Это можно сделать способом, аналогичным приведенному ниже:
@Before
public void setUp() throws Exception
{
logger.info("Performing the setup of test {}", testName.getMethodName());
IDatabaseConnection connection = null;
try
{
connection = getConnection();
IDataSet dataSet = getDataSet();
//The following line cleans up all DbUnit recognized tables and inserts and test data before every test.
DatabaseOperation.CLEAN_INSERT.execute(connection, dataSet);
}
finally
{
// Closes the connection as the persistence layer gets it's connection from elsewhere
connection.close();
}
}
Обратите внимание, что всегда рекомендуется выполнять любые действия по настройке в методе установки @Before
, а не в методе @After
teardown. Последнее указывает на то, что вы создаете новые объекты базы данных в тестируемом методе, который IMHO не совсем легко поддается тестируемому поведению. Кроме того, если вы выполняете очистку после теста, чтобы убедиться, что второй тест выполняется правильно, то любая такая очистка фактически является частью настройки второго теста, а не разбором первого.
Альтернативой использованию DbUnit является запуск новой транзакции в вашем методе установки @Before
и откат ее в методе @After
teardown. Это будет зависеть от того, как написан ваш слой доступа к данным.
Если ваш уровень доступа к данным принимает Connection
объекты, тогда ваша подпрограмма установки должна их создать и отключить автоматическую фиксацию. Также существует предположение, что ваш уровень доступа к данным не будет вызывать Connection.commit
. Предполагая предыдущее, вы можете откатить транзакцию, используя Connection.rollback()
в вашем методе разрыва.
Что касается управления транзакциями, приведенный ниже фрагмент демонстрирует, как можно это сделать, используя, например, JPA:
@Before
public void setUp() throws Exception
{
logger.info("Performing the setup of test {}", testName.getMethodName());
em = emf.createEntityManager();
// Starts the transaction before every test
em.getTransaction.begin();
}
@After
public void tearDown() throws Exception
{
logger.info("Performing the teardown of test {}", testName.getMethodName());
if (em != null)
{
// Rolls back the transaction after every test
em.getTransaction().rollback();
em.close();
}
}
Аналогичные подходы должны быть применены для других сред ORM или даже для вашего пользовательского уровня персистентности, если вы его написали.