2010-10-26 27 views
5

我希望能够验证每个工作单元是在其自己的交易中完成,还是作为单个全局交易的一部分完成。是否有可能测试过程的事务性?

我有一个方法(使用弹簧定义和休眠),这是形式:

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服务器环境。

This Works。然而,这个行为(批处理)不被改变是非常重要的,所以我想创建一个测试来测试这种行为。如果可能的话,我想在不更改代码的情况下执行此操作。

因此,一些打开我的选择是:

  1. 数批 作业的运行过程中 打开数据库的事务。

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

  3. 代码审查。

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

那么,有没有人有一种方法,使我能够测试此代码,最好通过系统测试或集成测试?

回答

2

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

然后,您可以让updateSomething()方法真正写入HSQL数据库,但使用模拟框架来模拟updateSomethingElse()方法并从该方法中抛出RuntimeException。完成后,您可以对HSQLDB执行查询,以确认updateSomething()的东西已回滚。

这将需要一些管道来设置HSQLDB和事务管理器,但是当这样做完成后,您可以在没有外部依赖关系的情况下进行测试,可以随时重新运行。

相关问题