使用服务和DAO测试事务传播

时间:2015-03-27 16:53:45

标签: java spring unit-testing transactions dao

我有一个服务类的服务方法,它是一个Spring bean,看起来像

@Transactional
public void doThis() {
    dao.d1();
    dao.d2();
}

在我的DAO类中,它扩展了Spring的NamedParameterJdbcDaoSupport。我把它设置为

@Transactional(propagation = Propagation.MANDATORY)
public void d1(){...}

@Transactional(propagation = Propagation.MANDATORY)
public void d2(){...}

,配置如下

<tx:annotation-driven proxy-target-class="true" transaction-manager="transactionManager" />

   

现在我的问题是,如何在Spring上下文中集成测试?我用AbstractTransactionalJUnit4SpringContextTests和一个嵌入式数据库测试了我的DAO。我现在如何测试服务链和DAO,如果dao抛出RuntimeException,我可以看到整个事务被回滚?

希望我能解释清楚。欢迎任何提示/建议

2 个答案:

答案 0 :(得分:0)

如果没有检测代码来测试此事务案例,可能很难将其转换为简单的可重复JUnit测试。

在dao中添加一些额外的代码,你可以让你的d2方法寻找强制它抛出测试RuntimeException的东西。也许ThreadLocal标志可用于表示您希望代码失败。

或者,您可以每次都使d2()失败,直到您觉得正确应用事务语义为止。

答案 1 :(得分:0)

我实际上只是用AbstractTransactionalJUnit4SpringContextTests和嵌入式数据库测试它,因为我会测试我的DAO。只需在故事中添加服务层,以及在下游触发的方法中抛出RuntimeException的DAO存根。它工作正常。验证事务回滚