Mat*_*ell 5 java database spring jpa transactional
我希望能够验证每个工作单元是在自己的事务中完成的,还是作为单个全局事务的一部分完成的.
我有一个方法(使用spring和hibernate定义),其形式如下:
private void updateUser() {
updateSomething();
updateSomethingElse();
}
Run Code Online (Sandbox Code Playgroud)
这是从两个地方调用的,用户登录时的网站和每天运行的批处理作业.对于Web服务器上下文,它将与Web服务器创建的事务一起运行.对于批处理作业,每个用户必须有一个事务,因此如果在此方法期间出现故障,则回滚事务.所以我们有两种方法:
@Transactional(propagation=Propagation.REQUIRES_NEW)
public void updateUserCreateNewTransaction() {
updateUser();
}
@Transactional(propagation=Propagation.REQUIRED)
public void updateUserWithExistingTransaction() {
updateUser();
}
Run Code Online (Sandbox Code Playgroud)
从批处理作业调用updateUserCreateNewTransaction(),并从Web服务器上下文调用updateUserWithExistingTransaction().
这有效.但是,(批量)的这种行为不能改变是非常重要的,所以我希望创建一个测试这种行为的测试.如果可能的话,我想在不更改代码的情况下这样做.
所以对我开放的一些选择是:
计算批处理作业运行期间在数据库中打开的事务.
在updateSomethingElse()方法中以某种子替换方式更改数据,以便至少一个用户更新失败,并检查该用户的updateSomething()是否未发生.
代码审查.
1是一个非常依赖于数据库的方法,我如何保证hibernate不会创建事务呢?2似乎更好,但设置起来非常复杂.3并不真实,因为我们需要为每个版本做一个.
那么,有没有人有一种方法可以让我测试这段代码,最好是通过系统测试或集成测试?
我会尝试使用内存中的 HSQLDB 和 EasyMock (或其他一些模拟框架)在单元测试工具中设置测试。
然后,您可以让该updateSomething()方法真正写入 HSQL 数据库,但使用模拟框架来模拟该updateSomethingElse()方法并从该方法中抛出 a RuntimeException。完成后,您可以对 HSQLDB 执行查询以验证内容是否updateSomething()已回滚。
它需要一些管道来设置 HSQLDB 和事务管理器,但是完成后,您就可以进行没有外部依赖项的测试,并且可以随时重新运行。
| 归档时间: |
|
| 查看次数: |
202 次 |
| 最近记录: |