【问题标题】:Is it possible to test the transactionality of a process?是否可以测试流程的事务性?
【发布时间】:2011-04-30 16:38:39
【问题描述】:

我希望能够验证每个工作单元是在其自己的事务中完成,还是作为单个全局事务的一部分。

我有一个方法(使用 spring 和 hibernate 定义),其形式为:

private void updateUser() {
    updateSomething();
    updateSomethingElse();
}

这是从两个地方调用的,用户登录时的网站和每天运行的批处理作业。对于 Web 服务器上下文,它将使用 Web 服务器创建的事务运行。对于批处理作业,它必须为每个用户有一个事务,以便如果在此方法期间发生故障,事务将回滚。所以我们有两种方法:

@Transactional(propagation=Propagation.REQUIRES_NEW)
public void updateUserCreateNewTransaction() {
    updateUser();
}

@Transactional(propagation=Propagation.REQUIRED)
public void updateUserWithExistingTransaction() {
    updateUser();
}

updateUserCreateNewTransaction() 从批处理作业调用,updateUserWithExistingTransaction() 从 Web 服务器上下文调用。

这行得通。但是,不改变(批次的)这种行为是非常重要的,所以我希望创建一个测试来测试这种行为。如果可能的话,我想在不更改代码的情况下这样做。

所以对我开放的一些选项是:

  1. 计算在 批处理运行期间的数据库 工作。

  2. 在 updateSomethingElse() 方法中以某种微妙的方式更改数据,以便至少有一个用户更新失败,并检查该用户的 updateSomething() 是否尚未发生。

    李>
  3. 代码审查。

1 是一个非常依赖数据库的方法,我如何保证hibernate 无论如何都不会创建事务? 2似乎更好,但设置起来非常复杂。 3 不太实用,因为我们需要为每个版本都做一个。

那么,有没有人可以让我测试这段代码的方法,最好是通过系统测试或集成测试?

【问题讨论】:

    标签: java database spring jpa transactional


    【解决方案1】:

    我会尝试使用内存中的 HSQLDB 和 EasyMock(或其他一些模拟框架)在单元测试工具中设置测试。

    然后您可以让 updateSomething() 方法真正写入 HSQL 数据库,但使用模拟框架模拟 updateSomethingElse() 方法并从该方法中抛出 RuntimeException。完成后,您可以对 HSQLDB 执行查询,以验证 updateSomething() 内容是否已回滚。

    设置 HSQLDB 和事务管理器需要一些管道,但完成后,您将获得一个没有外部依赖项的测试,可以随时重新运行。

    【讨论】:

      【解决方案2】:

      您可以做的另一件事是为 Hibernate 的事务配置日志输出:

      http://docs.jboss.org/hibernate/core/3.3/reference/en/html/session-configuration.html#configuration-logging

      如果您使用跟踪日志级别为 org.hibernate.transaction 创建 log4j 类别,它应该告诉 Hibernate 在单元测试期间执行事务方面的所有内容。

      【讨论】:

        猜你喜欢
        • 2014-02-24
        • 2021-08-16
        • 2021-11-15
        • 2019-04-18
        • 2013-09-13
        • 1970-01-01
        • 1970-01-01
        • 2021-12-26
        • 2012-05-18
        相关资源
        最近更新 更多