У меня проблемы с настройкой, чтобы это работало. В основном, я хочу, чтобы тесты заканчивались для работы базы данных в том же состоянии, что и раньше. Это происходит при использовании сеансов и соединений Spring/Hibernate, но не для DBUnit. Я пробовал много вещей, и в этот момент я делал что-то вроде обертывания общего источника данных в TransactionAwareDataSourceProxy
и выполнял загрузку набора данных вручную вместо использования @DatabaseSetup
.DBUnit load dataset and rollback
this.databaseConnection = new DatabaseConnection(dataSource.getConnection());
IDataSet xmlFileDataSet = new FlatXmlDataSetBuilder().build(getClass().getResourceAsStream("/dataset.xml"));
DatabaseOperation.REFRESH.execute(databaseConnection, xmlFileDataSet);
И это просто не работает. Я проверил объект dataSource, и это экземпляр TransactionAwareDataSourceProxy
, поэтому все должно быть на месте. Все данные в наборе данных фиксируются и сохраняются, и все данные, добавленные/измененные внутри сеанса, управляемого весной, отсутствуют.
Кто-нибудь знает, что мне может не хватать, или кто-то сделал это раньше и столкнулся с теми же проблемами?
Текущий код (с использованием TransactionAwareDataSourceProxy и без него).
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {
RecipeManagementITConfig.class,
SpringJpaTestConfig.class,
DatabaseITConfig.class
},
initializers = {PleaseWork.class})
@TestExecutionListeners({
DependencyInjectionTestExecutionListener.class,
DirtiesContextTestExecutionListener.class,
TransactionalTestExecutionListener.class,
DbUnitTestExecutionListener.class
})
@TransactionConfiguration(defaultRollback = true)
@Transactional
public class DefaultIngredientServiceIT {
@Autowired
protected DataSource dataSource;
@Before
public void init() throws Exception {
System.out.println("> " + dataSource); // org.[email protected]d4ce346
dbTester = new DataSourceDatabaseTester(dataSource);
dbTester.setDataSet(getDataSet());
dbTester.setSetUpOperation(DatabaseOperation.REFRESH);
dbTester.onSetup();
}
@After
public void destroy() throws Exception {
dbTester.onTearDown();
}
private IDataSet getDataSet() throws Exception {
return new FlatXmlDataSetBuilder().build(getClass().getResourceAsStream("/dataset.xml"));
}
@Transactional
@Test
public void testDeletionOfIngredients() {
(...)
}
}
Привет. Спасибо за ответ. Я верю, что вы говорите, это всего лишь обертка для того, что я делаю. Я попробую, но я сомневаюсь, что это решит мою проблему. – rpvilao
Я просто попробовал ваше решение, и оно не работает. Я даже дополнил прокси-сервер, поддерживающий транзакцию, и он все равно не работает:/ – rpvilao
Попробуйте добавить @TransactionConfiguration (defaultRollback = true) и пометить тест как @Transactional. Все изменения должны быть отброшены даже в DBUnit. –