我正在JUnit測試中測試我的DAO的CRUD操作。 當我執行單個測試時,Hibernate總是重置模式並將數據庫填充到已知的狀態中。但是當我執行多個測試在行,Hibernate重置模式一次,然後數據在執行測試期間累積。休眠單元測試 - 重置模式
這是一個意外的行爲,所以我想在測試方法@Before
中添加一個函數,該函數顯式重置模式以避免在執行鏈期間先前測試創建的邊數據的殘留。
任何提示?
謝謝
我正在JUnit測試中測試我的DAO的CRUD操作。 當我執行單個測試時,Hibernate總是重置模式並將數據庫填充到已知的狀態中。但是當我執行多個測試在行,Hibernate重置模式一次,然後數據在執行測試期間累積。休眠單元測試 - 重置模式
這是一個意外的行爲,所以我想在測試方法@Before
中添加一個函數,該函數顯式重置模式以避免在執行鏈期間先前測試創建的邊數據的殘留。
任何提示?
謝謝
首先,你所做的不是單元測試,而是集成測試。
提示:
org.springframework.orm.hibernate3.LocalSessionFactoryBean
的一些相關代碼。...
Connection con = session.connection();
Dialect dialect = Dialect.getDialect(getConfiguration().getProperties());
String[] sql = getConfiguration().generateSchemaCreationScript(dialect);
executeSchemaScript(con, sql);
你可以開始交易前,交易和回滾事務中的每個@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());
}
}
請注意,這不是最簡單的方法,上面的代碼更多用於演示目的。
大部分代碼不應該使用事務嗎?如果是這樣,如果(據我所知),你通常不能嵌套交易 - 你如何使用這樣的東西? – 2013-05-14 23:18:48