2010-04-26 68 views
2

我正在JUnit測試中測試我的DAO的CRUD操作。 當我執行單個測試時,Hibernate總是重置模式並將數據庫填充到已知的狀態中。但是當我執行多個測試在,Hibernate重置模式一次,然後數據在執行測試期間累積。休眠單元測試 - 重置模式

這是一個意外的行爲,所以我想在測試方法@Before中添加一個函數,該函數顯式重置模式以避免在執行鏈期間先前測試創建的邊數據的殘留。

任何提示?

謝謝

回答

3

首先,你所做的不是單元測試,而是集成測試。

提示:

  • 使用交易和滾動回來。
  • 考慮使用DBUnit(不知道你的情況會有多大的幫助)。
  • 以下是org.springframework.orm.hibernate3.LocalSessionFactoryBean的一些相關代碼。

...

Connection con = session.connection(); 
Dialect dialect = Dialect.getDialect(getConfiguration().getProperties()); 
String[] sql = getConfiguration().generateSchemaCreationScript(dialect); 
executeSchemaScript(con, sql); 
1

你可以開始交易前,交易和回滾事務中的每個@Test方法,像這樣:

public class HibernateIntegrationTest { 
    protected static SessionFactory factory; 
    protected Session session; 

    @BeforeClass 
    public static void createSessionFactory() { 
     AnnotationConfiguration config = new AnnotationConfiguration(); 
     // ... 
     config.configure(); 
     factory = config.buildSessionFactory(); 
    }  
    @AfterClass 
    public static void closeSessionFactory() { 
     if (factory != null) { 
      factory.close(); 
     } 
    } 
    @Before 
    public void beginTransaction() { 
     session = factory.getCurrentSession(); 
     session.beginTransaction(); 
    } 
    @After 
    public void rollbackTransaction() {  
     if (session.getTransaction().isActive()) { 
      session.getTransaction().rollback(); 
     } 
     if (session.isOpen()) { 
      session.close(); 
     } 
    } 
} 

而且在你的測試類擴展此類。

public class DemoTest extends HibernateIntegrationTest { 
    @Test 
    public void createMyEntity() { 
     MyEntity e = new MyEntity(); 
     //... 
     session.save(e); 

     assertNotNull(e.getId()); 
    } 
} 

請注意,這不是最簡單的方法,上面的代碼更多用於演示目的。

+0

大部分代碼不應該使用事務嗎?如果是這樣,如果(據我所知),你通常不能嵌套交易 - 你如何使用這樣的東西? – 2013-05-14 23:18:48