代码之家  ›  专栏  ›  技术社区  ›  Matthew Farwell

是否可以测试进程的事务性?

  •  5
  • Matthew Farwell  · 技术社区  · 14 年前

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

    我有一个方法(使用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();
    }
    

    UpDeUrSeriCeReNeTraceActudio()从批处理作业调用,并且从Web服务器上下文中调用UpDeaUrServultEngultIsActudioTo()。

    这很管用。但是,不更改(批处理的)此行为非常重要,因此我希望创建一个测试此行为的测试。如果可能的话,我希望在不更改代码的情况下执行此操作。

    所以我可以选择:

    1. 统计在中打开的事务 批处理运行期间的数据库 工作。

    2. 在updatesOmethingElse()方法中以某种子站点方式更改数据,以便至少有一个用户更新失败,并检查该用户的updatesOmething()是否未发生。

    3. 代码审查。

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

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

    2 回复  |  直到 13 年前
        1
  •  2
  •   K Erlandsson    14 年前

    我将尝试使用内存中的hsqldb和easymock(或其他模拟框架)在单元测试工具中设置一个测试。

    你就可以拥有 updateSomething() 方法确实写入hsql数据库,但使用mock框架来模拟 updateSomethingElse() 方法和抛出 RuntimeException 从那个方法。完成后,可以对hsqldb执行查询,以验证 更新方法() 东西被卷回去了。

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

        2
  •  0
  •   Shivan Dragon    13 年前

    您还可以为hibernate的事务配置日志输出:

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

    如果使用trace log leve为org.hibernate.transaction创建log4j类别,它应该告诉hibernate在单元测试期间执行事务的所有操作。