我開始為不同的演算法創建 JUnit 測驗,但很快我意識到大部分時間我撰寫相同的代碼,所以我決定集中這些部分。
與其對資料庫進行多次呼叫,我更喜歡創建一個模擬并從 CSV 讀取值。我模擬每個負責呼叫 DB 并回傳值的提供者。
假設我有以下提供程式:A、B、C、D、E、F。
我為每個提供程式創建了一個抽象類,在該類上我有一些方法,一個從 csv 讀取值,另一個用于過濾結果并使用它在when-thenReturn陳述句中:AMock、BMock、CMock、DMock、EMock、FMock。
我知道我無法創建擴展所有這些類的測驗,所以目前,我使用以下解決方法:
EMock 擴展 FMock
DMock 擴展 EMock
CMock 擴展 DMock
BMock 擴展 CMock
AMock 擴展 BMock
MyTest1 擴展 AMock
MyTest2 擴展 AMock
MyTest3 擴展 CMock
等等
但我不太喜歡它,因為我不是每次都需要它,
例如如果 MyTest2 只需要 AMock 和 EMock,擴展 AMock 我擁有它們。
有沒有更優雅的方法?
uj5u.com熱心網友回復:
我寧愿使用組合(依賴注入)來實作這種抽象(可重用性),而不是繼承
像這樣:
class MyTest1 {
private AMock aMock;
...
}
當然你可以使用繼承來避免BMock,CMock中的重復。等等,但即使在這里,我寧愿使用組合來實作相同的目標。如果您想強制執行某些行為(通常通過建構式和抽象方法),通常應該使用繼承。
在您的情況下(據我了解),您對每個模擬獨立提供的功能更感興趣。
如果 EMock 在內部使用 BMock ... 中的方法來完成其任務:
class EMock {
private AMock aMock;
private BMock aMock;
...
}
如果 EMock 中沒有使用任何來自 BMock 的內容:
class MyTest1 {
private AMock aMock;
private BMock bMock;
...
private EMock eMock;
// further methods where aMock.doSomeStuff() ... is called.
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/508596.html
上一篇:創建單元測驗時必須手動添加對csproj檔案的專案參考
下一篇:如何從物件陣列中獲取交易總和