Hibernate Unit测试 - 重置架构

时间:2010-04-26 17:40:48

标签: java hibernate testing orm junit

我正在JUnit测试中测试我的DAO的CRUD操作。 当我执行单个测试时,Hibernate总是重置模式并以已知状态填充数据库。但是当我在中执行多个测试时,Hibernate会重置模式一次,然后在执行测试期间累积数据。

这是一个意外的行为,所以我想在测试的@Before方法中添加一个显式重置模式的函数,以避免在执行链期间由先前测试创建的副数据的持久性。

任何提示?

由于

2 个答案:

答案 0 :(得分: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 :(得分: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());
    }
}

请注意,这不是最干净的方法,上面的代码更多用于演示目的。