2015-06-17 4 views
2

У меня проблемы с настройкой, чтобы это работало. В основном, я хочу, чтобы тесты заканчивались для работы базы данных в том же состоянии, что и раньше. Это происходит при использовании сеансов и соединений 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() { 
    (...) 
} 

}

ответ

0

Попробуйте с помощью DataSourceDatabaseTester так:

public class MyTestCase { 

    @Autowired 
    private DataSource dataSource; 

    private IDatabaseTester dbTester; 

    @Before 
    public void init() throws Exception { 
     dbTester = new DataSourceDatabaseTester(getDataSource()); 
     dbTester.setDataSet(getDataSet()); 
     dbTester.onSetUp(); 
    } 

    @Destroy 
    public void destroy() throws Exception { 
     dbTester.onTearDown(); 
    } 

    private IDataSet getDataSet() throws Exception { 
     return new FlatXmlDataSet(new FileInputStream("dataset.xml")); 
    } 
} 
+0

Привет. Спасибо за ответ. Я верю, что вы говорите, это всего лишь обертка для того, что я делаю. Я попробую, но я сомневаюсь, что это решит мою проблему. – rpvilao

+0

Я просто попробовал ваше решение, и оно не работает. Я даже дополнил прокси-сервер, поддерживающий транзакцию, и он все равно не работает:/ – rpvilao

+0

Попробуйте добавить @TransactionConfiguration (defaultRollback = true) и пометить тест как @Transactional. Все изменения должны быть отброшены даже в DBUnit. –