簡體   English   中英

我應該如何單元測試調用MySQL存儲過程的Java?

[英]How should I unit test Java that calls a MySQL stored procedure?

我正在編寫一個簡單的應用程序,它將讀取一些記錄並將其插入數據庫中。 我已經編寫了一個處理插入邏輯的存儲過程,並計划單獨進行測試。 現在,我想為采用業務對象並將其傳遞給存儲過程調用的邏輯部分編寫一個良好的單元測試。

認為我想做的是傳遞數據庫連接的模擬,然后斷言該調用是使用預期的參數值進行的:

Connection dbConnection = makeMockConnection();  // how?
MyObjectWriter writer = new MyObjectWriter(dbConnection);
writer.write(someSampleObject);
// somehow assert that dbConnection called
// `sp_saveMyObject` with param values x, y, and z

但是,似乎在java.sql.Connection內部進行了大量工作,了解了它的工作原理,然后模擬了所有結果。 是否有一個為我完成所有這些工作的測試庫? 我走錯路了嗎?

您可以使用模擬存儲過程創建內存中的HSSQL數據庫。 模擬存儲過程將在表中插入一行,以顯示其已運行及其參數。 運行被測代碼,然后在數據庫中查看發生了什么。

您可以使用Decorator設計模式進行連接模擬。 使用您使用的驅動程序創建與數據庫的真實連接,該驅動程序由實現Connection接口並將Connection保留為成員的ConnectionImpl類包裝。
您不希望實際執行的每個真實調用都將其替換為模擬代碼,而每次逗留都將調用真實連接對象的相同方法(刪除該調用)。
這樣,您像往常一樣進行編碼,只是返回的對象與創建連接的方法不同。
現在,在模擬對象(您的ConnectionImpl)中,您可以添加例如檢查輸入的單元測試代碼。

如果您不關心MyObjectWriter工作原理,而只是關心它的工作原理,那么我傾向於編寫一個集成測試,而不必考慮單元測試。

您沒有提到如何測試存儲過程,所以請原諒我,但是我要做的是圍繞MyObjectWriter編寫測試,這些測試調用數據庫上的實際存儲過程,然后驗證數據庫狀態。 如果可能的話,我將使用內存數據庫來降低測試時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM