簡體   English   中英

春季交易管理測試

[英]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;
  • 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時將刪除數據庫架構。

請參閱: 可選的Hibernate Config屬性

示例片段:

<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方法都在事務上下文中執行,因此應該進行更改回滾。

候選條件:

  • 數據設置正在執行非事務性的操作(即DDL語句)
  • 測試中的某些內容實際上是在提交事務

您可以發布@Before方法嗎,我想知道您是要清除表還是實際刪除並重新創建它們?

據我所知,通過查看AbstractJUnit4SpringContextTests和TransactionalTestExecutionListener的Javadocs和源代碼,您需要注釋要使用@Transactional進行事務化的測試方法。

還有@BeforeTransaction和@AfterTransaction批注,您可以在其中更好地控制事務中運行的內容。

我建議您創建使用所有這些注釋(包括@Before)注釋的方法,然后使用這些方法的斷點運行測試。 這樣,您可以查看堆棧並確定spring是否為您啟動了事務。 如果您在堆棧中看到諸如“ TransactionInterceptor”之類的東西,或者名稱中帶有“ Transaction”之類的其他東西,則可能是您正在進行事務處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM