Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用服务和DAO测试事务传播_Java_Spring_Unit Testing_Transactions_Dao - Fatal编程技术网

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

Java 使用服务和DAO测试事务传播,java,spring,unit-testing,transactions,dao,Java,Spring,Unit Testing,Transactions,Dao,我有一个服务类的服务方法,它是一个Springbean,看起来像 @Transactional public void doThis() { dao.d1(); dao.d2(); } <tx:annotation-driven proxy-target-class="true" transaction-manager="transactionManager" /> 在我的DAO类中,它扩展了Spring的NamedParameterJDBCDAO支持。我把它设置

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

@Transactional
public void doThis() {
    dao.d1();
    dao.d2();
}
<tx:annotation-driven proxy-target-class="true" transaction-manager="transactionManager" />
在我的DAO类中,它扩展了Spring的NamedParameterJDBCDAO支持。我把它设置为

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

@Transactional(propagation = Propagation.MANDATORY)
public void d2(){...}
配置如下所示

@Transactional
public void doThis() {
    dao.d1();
    dao.d2();
}
<tx:annotation-driven proxy-target-class="true" transaction-manager="transactionManager" />

现在我的问题是,如何在Spring环境中进行集成测试?我已经用AbstractTransactionalJUnit4SpringContextTests和嵌入式数据库测试了我的DAO。我现在如何测试服务链和DAO,这样如果DAO抛出RuntimeException,我就可以看到整个事务被回滚了


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

如果不检测代码以测试此事务性案例,则很难将其转换为简单的可重复JUnit测试

通过dao中的一点额外代码,您可以让d2方法查找一些东西来强制它抛出测试运行时异常。也许可以使用ThreadLocal标志来表示您希望代码失败


或者,您可以让d2()每次都失败,直到您对事务语义的正确应用感到满意。

实际上,我只是用AbstractTransactionalJUnit4S普林gContextTests和嵌入式数据库对其进行了测试,就像我测试DAO一样。只需在故事中添加服务层和一个DAO存根,该存根将在下游触发的方法中抛出RuntimeException。它工作得很好。事务回滚已验证

谢谢您的评论,Marc。我想知道是否可以使用一个DAO模拟,首先在d1方法中抛出Exception,然后测试服务层调用方中的事务是否回滚;然后更改mock,让它在d2中抛出异常,并查看事务是否回滚。这是我的理想案例,我喜欢使用DAO模拟,但我不确定您的第一个测试将验证什么。如果d1()中止,d2()永远不会被调用,对吗?让d2()中止应该回滚d1()的更改。我的另一个想法是关于在哪里验证回滚。很可能您的对象状态不足以进行检查-最好是验证底层数据存储?是的。我想测试d2是否失败,d1是否回滚,我正在检查是否使用存储在嵌入式数据存储中的数据