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

Java 是否可以测试流程的事务性?,java,database,spring,jpa,transactional,Java,Database,Spring,Jpa,Transactional,我希望能够验证每个工作单元是在自己的事务中完成的,还是作为单个全局事务的一部分完成的 我有一个方法(使用spring和hibernate定义),其形式如下: private void updateUser() { updateSomething(); updateSomethingElse(); } 这是从两个地方调用的,一个是用户登录时的网站,另一个是每天运行的批处理作业。对于web服务器上下文,它将与web服务器创建的事务一起运行。对于批处理作业,每个用户必须有一个事务,这

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

我有一个方法(使用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(),从web服务器上下文调用updateUserWithExistingTransaction()

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

因此,我有以下几种选择:

  • 计算在中打开的事务 批处理运行期间的数据库 工作

  • 在updateMethingElse()方法中,以某种子节点方式更改数据,以便至少有一个用户更新失败,并检查该用户的updateMething()是否未发生

  • 代码审查

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


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

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

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


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

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

    如果您使用trace log leve为org.hibernate.transaction创建一个log4j类别,那么它应该告诉您hibernate在单元测试期间在事务方面所做的一切