我想在使用Spring的JUnit測試中執行SQL腳本。該腳本正在用於爲測試設置數據。但是,腳本運行時,腳本中的INSERT將在每次測試後提交。 Spring文檔說不希望用DDL進行回滾,但我腳本中的所有內容都是DML。它包含的所有內容是INSERT語句並獲取最後一個插入ID(SET @blah = LAST_INSERT_ID())。使用Spring測試執行SQL腳本測試正在提交更改
我配置錯了嗎?我正在使用這個對MySQL數據庫。我們的配置如下:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/applicationContext.xml" })
@TransactionConfiguration(defaultRollback = true)
public class OrderTestCase extends AbstractTransactionalJUnit4SpringContextTests {
@Before
public void runSql() {
String fileName = StringUtils.replace(getClass().getName(), ".", "/") + ".sql";
Resource resource = applicationContext.getResource(fileName);
if (resource.exists()) {
executeSqlScript(fileName, false);
} else {
LOGGER.debug("Resource doesn't exist: {}", resource);
}
}
@Test
public void testLoadOrders() {
Collection<Order> orders= dao.findAll();
assertTrue(orders.size() == 3);
}
}
這是我根據一些研究發生的事情。第一次調用executeSqlScript是在一個單獨的事務中運行。 Spring的SimpleJdbcTemplate.update方法由executeSqlScript調用。因爲這是從連接池獲得的JDBC連接的作用域,所以我不保證在隨後訪問數據庫時獲得相同的連接,因此無法保證在同一事務中運行。
如果我要通過TransactionManager或(Hibernate Session Factory)完成所有數據庫操作,那麼它會工作,因爲內部機制如何限制事務。在這裏,我的選擇是:
圖如何運行SimpleJdbcTemplate.update和我在同一個事務測試隨後的實際代碼。我想我可以做到這一點,但迄今爲止我的努力沒有結果。
執行通過SessionFactory設置的所有測試數據。因此,我不是通過JDBC來執行直接的SQL腳本,而是填充模型對象並通過Hibernate DAO持久化它們。
我在正確的軌道上嗎?任何人都可以提供更多指導嗎?
對我來說看起來沒問題。數據源配置是下一個看看 – sw1nn 2012-03-12 21:32:40