我正在JUnit测试中测试我的DAO的CRUD操作。 当我执行单个测试时,Hibernate总是重置模式并以已知状态填充数据库。但是当我在行中执行多个测试时,Hibernate会重置模式一次,然后在执行测试期间累积数据。
这是一个意外的行为,所以我想在测试的@Before
方法中添加一个显式重置模式的函数,以避免在执行链期间由先前测试创建的副数据的持久性。
任何提示?
由于
答案 0 :(得分:3)
首先,你所做的不是单元测试,而是集成测试。
提示:
org.springframework.orm.hibernate3.LocalSessionFactoryBean
的一些相关代码。...
Connection con = session.connection();
Dialect dialect = Dialect.getDialect(getConfiguration().getProperties());
String[] sql = getConfiguration().generateSchemaCreationScript(dialect);
executeSchemaScript(con, sql);
答案 1 :(得分: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());
}
}
请注意,这不是最干净的方法,上面的代码更多用于演示目的。