【问题标题】:Unit testing after adding database with Hibernate使用 Hibernate 添加数据库后的单元测试
【发布时间】:2015-04-25 19:48:17
【问题描述】:

我已经使用休眠将数据库功能添加到了一个系统,该系统到目前为止还在内存中。当所有数据都是内存时,我可以使用 JUnit 在每次测试后恢复原始数据。

有没有办法通过新的 hibernate 添加来实现相同的结果? “相同的结果”是指从数据库的原始状态开始,进行可以改变数据库的测试,然后将数据库恢复到原始状态。

到目前为止,我的想法是:

  1. 在内存数据库中(这是一项 Hibernate 功能),但这不允许我使用我的实际数据。
  2. 向我添加“测试标志”,如果设置了 DOA,则不会提交更改。

我确信有更好的解决方案,但我还没有找到更好的解决方案。

【问题讨论】:

    标签: java hibernate jpa junit transactions


    【解决方案1】:

    您可以在每次测试之前启动数据库事务:

    @PersistenceContext
    private EntityManager em; 
    
    @Before
    public void init() {
        em.getTransaction().begin();
    }
    
    @After
    public void destroy() {
        em.getTransaction().rollback();
    }
    

    这样,每个测试在测试开始之前都有一个事务在运行,而这个事务在测试完成后回滚,所以你总是放弃当前测试经历的所有更改。

    【讨论】:

    • 此刻,假设我想添加用户 - 添加用户方法创建一个用户实例并调用 UserDAO 以获取会话、开始事务、添加新用户、提交更改并关闭会议。所以我认为我不能应用你的解决方案,因为提交是在方法期间完成的。
    • 如果您正在执行手动事务和会话管理,那么您确实无法使用此解决方案。如果您使用的是 Spring 或 Java EE,因此您只使用 @Transactional 标记您的服务方法,这将是一个有效的替代方案。
    • 你认为在hibernate之上使用Spring还是Java EE更好?无论如何我都会研究它,但作为一种动力,使用这些工具我还能获得什么?
    • 更好,因为它们为您带来了大多数开发人员已经熟悉的统一企业编程模型。您可以获得事务管理、AOP/拦截器支持、通用 DAO(Spring Data/DeltaSpike)、依赖注入。
    【解决方案2】:

    我认为我们应该清楚单元测试的定义。单元测试只能测试应用程序中的一个小单元(公共方法)。

    假设您有一个使用 Hibernate 与数据库交互的 DAO 层。现在 Hibernate 使用需要数据源的 SessionFactory。单元测试的数据源不应与您的生产应用程序的数据源相同。

    这个想法是定义一个测试数据源并使用内存数据库(hsqldb 或任何其他)。对于每个测试用例,您可以使用测试数据源在内存数据库上执行一些查询,并在执行单元测试后清除它。对于每个单元测试,您应该执行查询,以便为该特定测试完成测试数据设置。

    例如:如果您想测试以下内容: 1) 创建账户 2) 更新账户 3) 删除帐号

    然后有三个测试场景,每个场景可以有多个单元测试。

    现在在执行创建帐户测试之前,重要的是数据库没有此帐户。然后在 DAO 中调用 createAccount 方法进行测试。无需验证结果是否在数据库中。只需检查您的方法的返回,如果它与成功创建帐户时的预期相同,那么您的测试用例应该通过。

    对于更新账户,你的设置方法应该通过查询插入一个账户,然后你必须在DAO中为这个账户id调用updateAccount等等。

    请遵守单元测试的定义,不要一次将其用于测试多个功能。

    希望这会有所帮助。

    【讨论】:

    • 首先感谢您的回答,我不确定我的问题的哪一部分给人的印象是我正在使用单元测试来获得更多的功能,但我向您保证,情况并非如此。我的意思是我已经编写了许多单元测试,我正在尝试找到一种方法来修改它们,这样它们就不会损害数据。我也需要它来进行集成测试,对于某些测试,我更喜欢使用我现有的数据而不是使用空白内存数据库并自己填充它,这就是为什么我要求一种方法来使用我的原始数据库并恢复它.
    猜你喜欢
    • 2012-05-06
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多