2009-12-06 88 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