[英]Spring Transaction Management Test
我想使用SpringContextTests測試我的Dao類。
在我的方法類中,我擴展了AbstractTransactionalJUnit4SpringContextTests
,以使我的測試類與JUnit4集成。 我還設置了配置,並在@Before
初始化和數據庫清理,在@After
清除了@Before
。 我的測試課效果很好。
我的問題是,當我運行測試類並在數據庫中填充了數據時,原始數據沒有回滾並且數據庫被清除了。 在@Before
方法中,我清除數據庫並填充數據,以為我可以回滾數據庫,但不能回滾。
任何人都可以找到可以正常工作的示例並回滾數據庫中的信息。
ADDONS:
我的測試方法中的每個數據庫操作都會回滾。 但是在@Before
方法中執行super.deleteFromTables("person")
並不會回滾數據庫中所有以前的數據。
Spring回滾所有CRUD操作,但在不回滾事務之前清理數據庫。
謝謝所有回答我問題的人。 我從這些答案中學到了很多東西,但是並不能解決我的問題。
我知道我的測試數據可以進行事務管理,並且可以正常工作。
這是我的錯。
我忘記了有關數據庫命令的課程,當您在DML語句之后執行DDL語句時,它將自動提交事務。 我在DML之后執行DDL,方法是刪除所有記錄,然后ALTER
表的AUTO_INCREMENT
,這將導致自動提交並永久刪除表的所有記錄。
解決該場景解決了我的問題。
可能的原因:
例如,這是一個(我的頭頂,未編譯)
public class DBTest extends AbstractTransactionalJUnit4SpringContextTests {
@Autowired
private SomeDAO _aBeanDefinedInMyContextFile;
@Test
public void insert_works() {
assert _aBeanDefinedInMyContextFile.findAll() == 0;
_aBeanDefinedInMyContextFile.save(new Bean());
assert _aBeanDefinedInMyContextFile.findAll() == 1;
}
}
關鍵點:
SomeDAO
是一個接口,它對應於在我的上下文中聲明的Bean; 我不確定您的課有什么問題。 這是一個類的摘錄,該類使用dbunit和spring 2.5來完成您想要的工作:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={
"testContext.xml"})
@TransactionConfiguration
@Transactional
public class SampleDAOTest {
@Autowired
private DataSource dataSource;
@Autowired
private SampleDAO sampleDAO;
@Before
public void onSetUpInTransaction() throws Exception {
//Populate Test data
IDatabaseConnection dbUnitCon = new DatabaseConnection(DataSourceUtils.getConnection(dataSource), "DATASOURCE");
//read in from a dbunit excel file of test data
IDataSet dataSet = new XlsDataSet(new File("src/test/resources/TestData.xls"));
DatabaseOperation.INSERT.execute(dbUnitCon, dataSet);
}
@Test
public void testGetIntermediaryOrganisation() {
// Test getting a user
User object = sampleDAO.getUser(99L);
assertTrue(object.getValue);
}
}
此方法的優點之一是您不需要擴展任何類。 因此,您仍然可以擁有自己的測試層次結構。
如果您真的想堅持使用當前方法而不是使用@before注釋(我稀疏),則需要覆蓋以下方法,並將您的安裝代碼放入其中。
@Override
public void onSetUpInTransaction() throws Exception {...}
希望這可以幫助
您正在tx中的@Before方法中執行super.deleteFromTables。 因此,如果tx被回滾,刪除的內容也不會回滾嗎?
避開您的問題,我建議您使用單獨的數據庫實例來運行測試。 這樣,您可以安全地將其擦拭干凈,並使測試根據需要對其進行初始化。
據我所知,用於數據庫測試的Spring支持類僅回滾測試中發生的事情,而不回退測試的設置和拆卸中發生的事情。
同意混淆-您應該針對自己的數據庫架構運行測試。
這樣,您可以將休眠屬性設置為“ create-drop”:
使用create-drop時,顯式關閉SessionFactory時將刪除數據庫架構。
示例片段:
<bean id="sessionBean" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="hibernateProperties">
<props>
<prop key="hibernate.hbm2ddl.auto">create-drop</prop>
...etc
雖然我同意那個家伙建議使用經過測試的db進行測試的觀點,但沒有任何理由不能使用填充的db,因為@Before和@After方法都在事務上下文中執行,因此應該進行更改回滾。
候選條件:
您可以發布@Before方法嗎,我想知道您是要清除表還是實際刪除並重新創建它們?
據我所知,通過查看AbstractJUnit4SpringContextTests和TransactionalTestExecutionListener的Javadocs和源代碼,您需要注釋要使用@Transactional進行事務化的測試方法。
還有@BeforeTransaction和@AfterTransaction批注,您可以在其中更好地控制事務中運行的內容。
我建議您創建使用所有這些注釋(包括@Before)注釋的方法,然后使用這些方法的斷點運行測試。 這樣,您可以查看堆棧並確定spring是否為您啟動了事務。 如果您在堆棧中看到諸如“ TransactionInterceptor”之類的東西,或者名稱中帶有“ Transaction”之類的其他東西,則可能是您正在進行事務處理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.