我们目前正在测试JTA失败行为,在使用JMS接收消息的系统上,持久化它们,并使用另一个类发送结果。
整个事情都是用Spring捆绑在一起的。当前的单元测试使用HSQLDB,Apache ActiveMQ和Bitronix进行事务管理。这方面的成功是有限的,主要是因为HSQLDB没有实现XA事务。
所以这就是问题:如何在事务单元测试中最好地模拟数据库故障?有没有办法让标准的JDBC驱动程序(例如Oracle)在测试过程中失败?
n.b。按下电源按钮不是一个可重复的测试:)
答案 0 :(得分:3)
您需要确定您想要测试的内容 - 例如,如果您想测试Oracle在使用Bitronix的XA事务中的行为方式,那么根据duffymo的建议,模拟DAO对您没有帮助。在这种情况下,您需要找到一种在事务中断时断开连接的方法,然后查看Bitronix / Oracle如何处理恢复 - 例如启发式结果等。
请注意,在很多情况下,有一些方法可以在不实际使用XA事务的情况下获得相同的功能。它可以更简单,更快速,更可测试。例如,在非常常见的情况下,消息是从数据库中执行的MOM和DML消费的,有一种常见的模式,即如果没有XA就会离开,即使两个资源管理器也会更新。
答案 1 :(得分:1)
为测试编写一个模拟对象,其实现会在事务中间抛出异常。
由于您正在使用Spring,因此编写一个新的,仅测试的DAO接口实现是一件容易的事情,该实现以可重复,可预测的方式运行。只为测试注入'wonky DAO'。
当然,您正在使用XA驱动程序连接到数据库。否则两阶段提交将不起作用。