Java 是否可以测试流程的事务性?
我希望能够验证每个工作单元是在自己的事务中完成的,还是作为单个全局事务的一部分完成的 我有一个方法(使用spring和hibernate定义),其形式如下:Java 是否可以测试流程的事务性?,java,database,spring,jpa,transactional,Java,Database,Spring,Jpa,Transactional,我希望能够验证每个工作单元是在自己的事务中完成的,还是作为单个全局事务的一部分完成的 我有一个方法(使用spring和hibernate定义),其形式如下: private void updateUser() { updateSomething(); updateSomethingElse(); } 这是从两个地方调用的,一个是用户登录时的网站,另一个是每天运行的批处理作业。对于web服务器上下文,它将与web服务器创建的事务一起运行。对于批处理作业,每个用户必须有一个事务,这
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()
这很有效。但是,不改变(批处理的)此行为非常重要,因此我希望创建一个测试来测试此行为。如果可能,我希望在不更改代码的情况下执行此操作
因此,我有以下几种选择:
那么,有没有人能让我测试这段代码的方法,最好是通过系统测试或集成测试?我会尝试使用内存中的HSQLDB和EasyMock(或其他模拟框架)在单元测试工具中设置测试 然后,您可以让
updateMething()
方法真正写入HSQL数据库,但使用mock框架模拟updateMethingElse()
方法,并从该方法引发RuntimeException
。完成后,您可以对HSQLDB执行查询,以验证updateMething()
内容是否已回滚
设置HSQLDB和事务管理器需要一些管道,但完成后,您将有一个没有外部依赖项的测试,可以随时重新运行。您可以做的另一件事是为Hibernate的事务配置日志输出: 如果您使用trace log leve为org.hibernate.transaction创建一个log4j类别,那么它应该告诉您hibernate在单元测试期间在事务方面所做的一切