【问题标题】:Clearing Entire Database (for unit testing with Hibernate)清除整个数据库(用于使用 Hibernate 进行单元测试)
【发布时间】:2011-04-08 11:32:59
【问题描述】:

我的单元测试使用 Hibernate 连接到内存中的 HSQLDB 数据库。我希望有一种方法可以在 JUnit 的 TestCase.setUp() 方法中清除和重新创建数据库(包括架构和所有数据的整个数据库)。

【问题讨论】:

  • 如果您正在测试您的数据库,那么 imo 它不是单元测试。
  • 我正在测试我的程序,它恰好使用了数据库。
  • 我正在测试一个用于访问数据库中数据的类

标签: java unit-testing hibernate


【解决方案1】:

您可以配置您的休眠配置文件以强制数据库每次都重新创建您的表和架构。

<!-- Drop and re-create the database schema on startup -->
<property name="hbm2ddl.auto">create-drop</property>

hibernate.hbm2ddl.auto 在创建 SessionFactory 时自动验证模式 DDL 或将其导出到数据库。使用 create-drop,当 SessionFactory 显式关闭时,数据库模式将被删除。

例如验证 |更新 |创建 |创建删除

如果您不喜欢在真实的休眠配置中使用此配置,您可以创建一个休眠配置用于单元测试。

【讨论】:

  • 这只会在每次运行时重新创建它。这意味着如果您从 Eclipse 运行测试,许多测试会失败,如果单独运行会通过。至少这是我的经验。
  • @BillK 这也是我的经验。
【解决方案2】:

如果您使用的是 Spring,那么您可以在单元测试中使用 @Transactional 属性,默认情况下,在每个单元测试结束时,所有持久化的数据都会自动回滚,因此您无需担心删除表每次。

我在这里浏览了一个示例http://automateddeveloper.blogspot.com/2011/05/hibernate-spring-testing-dao-layer-with.html

【讨论】:

    【解决方案3】:
    hibernate.hbm2ddl.auto=create-drop
    

    并引导一个新的SessionFactory

    【讨论】:

      【解决方案4】:

      从测试的角度来看,最佳做法是在每次测试后清除数据。如果您使用 create-drop,它也会删除表模式。这会导致每次都重新创建架构的开销。

      由于您使用的是 hsql,它提供了一种直接截断机制,因此在这种情况下它是最好的选择。


      @After
      public void clearDataFromDatabase() {
          //Start transaction, based on your transaction manager
          dao.executeNativeQuery("TRUNCATE SCHEMA PUBLIC AND COMMIT"); 
          //Commit transaction
      }   
      

      【讨论】:

        【解决方案5】:

        每次都要小心擦拭世界并重新开始。很快,您可能希望从系统中加载的一组“默认”测试数据开始。因此,您真正想要的是在每次测试运行之前恢复到该基本状态。在这种情况下,您希望在每次测试运行之前都有一个回滚的事务

        要做到这一点,您应该注释您的 JUnit 类:

        @RunWith(SpringJUnit4ClassRunner.class)
        @ContextConfiguration(locations={"classpath:/path/to/spring-config.xml"})
        @TransactionConfiguration(transactionManager="myTransactionManager", defaultRollback=true)
        public class MyUnitTestClass {
        ...
        }
        

        然后用@Transactional注释你的每个测试方法:

        @Transactional
        @Test
        public void myTest() {
            ...
        }
        

        【讨论】:

          猜你喜欢
          • 2012-05-06
          • 2019-04-01
          • 2017-04-05
          • 1970-01-01
          • 1970-01-01
          • 2011-10-04
          • 1970-01-01
          • 1970-01-01
          • 2011-08-12
          相关资源
          最近更新 更多