0

我们目前正在测试 JTA 故障行为,在一个使用 JMS 接收消息、持久化它们并使用另一个类发送结果的系统上。

整个事情是使用 Spring 捆绑在一起的。当前的单元测试使用 HSQLDB、Apache ActiveMQ 和 Bitronix 进行事务管理。这方面的成功是有限的,主要是因为 HSQLDB 没有实现 XA 事务。

那么问题来了:如何在事务单元测试中最好地模拟数据库故障?有什么方法可以让标准 JDBC 驱动程序(比如 Oracle)在测试过程中失败?

注意按电源按钮不是可重复的测试:)

4

2 回答 2

3

您需要决定到底要测试什么——例如,如果您想测试 Oracle 在与 Bitronix 的 XA 事务中的行为,那么按照 duffymo 的建议模拟 DAO 对您没有帮助。在这种情况下,您需要找到一种在事务中间断开连接的方法,然后查看 Bitronix/Oracle 将如何处理恢复 - 例如启发式结果等。

请注意,在很多情况下,有一些方法可以在不实际使用 XA 事务的情况下获得相同的功能。它可以更简单、更快、更可测试。例如,在非常常见的情况下,当从 MOM 消费消息并在数据库中执行 DML 时,即使两个资源管理器正在更新,如何在没有 XA 的情况下摆脱困境的常见模式也是如此。

于 2009-12-06T18:06:11.440 回答
1

为测试编写一个模拟对象,其实现在事务中间抛出异常。

由于您使用的是 Spring,因此编写一个新的、仅测试的 DAO 接口实现是一件容易的事,该实现以可重复、可预测的方式运行。仅为测试注入“wonky DAO”。

当然,您正在使用 XA 驱动程序连接到数据库。否则两阶段提交将不起作用。

于 2009-12-06T17:49:06.210 回答