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

标签 java database spring jpa transactional

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

我有一个方法(使用 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 并不实际,因为我们需要为每个版本做一个。

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

最佳答案

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

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

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

关于java - 是否可以测试流程的事务性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4022963/

相关文章:

sql - 更改具有外键的表(sql server)中的记录?

java - Spring Framework MVC 基本 Controller 方法

spring -/src/groovy中的动态 Autowiring

java - Swagger Spring 注解 : proper response formatting

Java程序故障

java - 为什么列表在 python 和 Java 中表现不同?

python - 如何在 Python 中创建可在 Microsoft Access 中链接的 Web 服务?

java - 写入 CSV 文件时如何跳过第一行

php - Doctrine 一对多关系返回 Doctrine_Record 而不是 Doctrine_Collection

html - 如何国际化html页面