Java Hibernate单元测试-重置模式

Java Hibernate单元测试-重置模式,java,hibernate,testing,orm,junit,Java,Hibernate,Testing,Orm,Junit,我正在JUnit测试中测试DAO的CRUD操作。 当我执行单个测试时,Hibernate总是重置模式,并以已知的状态填充数据库。但是,当我在一行中执行多个测试时,Hibernate会重置模式一次,然后在测试执行过程中积累数据 这是一个意外的行为,因此我想在测试的@Before方法中添加一个函数,该函数显式重置模式,以避免在执行链期间出现由以前的测试创建的边数据 有什么建议吗 谢谢首先,您所做的不是单元测试,而是集成测试 小贴士: 使用事务并回滚 考虑使用DBUnit(不确定它对您的情况有多大帮

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

这是一个意外的行为,因此我想在测试的
@Before
方法中添加一个函数,该函数显式重置模式,以避免在执行链期间出现由以前的测试创建的边数据

有什么建议吗


谢谢

首先,您所做的不是单元测试,而是集成测试

小贴士:

  • 使用事务并回滚
  • 考虑使用DBUnit(不确定它对您的情况有多大帮助)
  • 下面是来自
    org.springframework.orm.hibernate3.LocalSessionFactoryBean
    的一些相关代码


您可以在每个
@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());
    }
}

请注意,这不是最干净的方法,上面的代码更多地是为了演示。

大多数代码不应该已经在使用事务了吗?如果是这样的话,如果(据我所知)您通常不能嵌套事务——您如何使用这样的东西?
public class DemoTest extends HibernateIntegrationTest {
    @Test
    public void createMyEntity() {
        MyEntity e = new MyEntity();
        //...
        session.save(e);

        assertNotNull(e.getId());
    }
}