2009-12-06 60 views
0

我们目前正致力于在使用JMS接收消息的系统上测试JTA失败行为,并保留它们,并使用另一个类发送结果。JTA:如何测试JMS和JDBC失败?

整个事情是用Spring绑在一起的。目前的单元测试使用HSQLDB,Apache ActiveMQ和Bitronix进行事务管理。成功与否受到限制,主要是因为HSQLDB没有实现XA事务。

所以,这里是一个问题:如何最好地模拟交易单元测试中的数据库故障?有没有办法让一个标准的JDBC驱动程序(例如Oracle)在测试过程中失败?

n.b.按下电源按钮不是可重复的测试:)

回答

1

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

由于您使用的是Spring,因此编写DAO接口的新测试实现是一件容易的事情,该实现的行为以可重复的,可预测的方式进行。仅仅为了测试而注入“不稳定的DAO”。

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

+0

在测试应用程序逻辑和事务管理器方面不是一个坏主意,但它不会测试数据库驱动程序的正确行为。所以我会投票赞成,但等待进一步的想法。 – xcut 2009-12-08 12:00:51

3

您需要决定您要测试的是什么 - 例如,如果您想测试Oracle如何在与Bitronix的XA事务中表现出色,那么按照duffymo的建议嘲笑DAO不会对您有所帮助。在这种情况下,您需要找到一种在事务处理过程中断开连接的方式,然后了解Bitronix/Oracle如何处理恢复 - 例如,启发式结果等。

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

+0

不错的评论,除了他们缺少建议:)你有一个链接“常见模式”,你指的是?另外,有关如何在单元测试中强制连接中断的建议? – xcut 2009-12-08 12:01:52

+1

对于模式描述: http://www.oracle.com/technology/pub/articles/dev2arch/2006/01/custom-mdb-processing2.html 至于连接中断它再次取决于您的特定设置 - 例如,您可以运行在虚拟化环境(VMWare)中启动您的测试并从主机系统关闭网络接口,或者只是翻转防火墙规则,或通过代理连接并在此过程中将其终止。 – maximdim 2009-12-08 18:03:55