假設我正在為移動應用程序構建按月訂閱收費功能,有多種收費方式??梢酝ㄟ^ Apple Pay、Google 錢包、paypal、visa/master 取決于平臺。每個提供者都有自己的實現和各自的 JUnit 測試(因為他們使用的是 Java)。為了評估幾個基本功能,每個實現都必須驗證的情況很少。因此,計劃是編寫基本測試并調用抽象驗證方法。這是我的方法,public abstract class BaseBillingTest { public abstract BillCharger getBillCharger(); public abstract void ValidateTest1(Bill input, Bill output); public void tests_case_1(){ Bill input = new Bill(<some value>); Bill Output = getBillCharger().charge(input); ValidateTest1(input, output); }}任何派生的測試類都將實現抽象方法,因此它有責任實現驗證方法。派生測試類不需要知道基礎測試中發生了什么,因為它們可以根據輸入驗證輸出。有什么建議可以以更優雅的方式解決這個問題嗎?我可以在這種情況下應用任何設計模式嗎?
2 回答

慕標5832272
TA貢獻1966條經驗 獲得超4個贊
在我看來,您的繼承示例并不是使用這兩種抽象方法的最佳方式。一個是結構性的,另一個是靜態的 - 您可以根據另一個法案驗證一個法案。
在這兩種情況下,繼承在這里都不是正確的關系。您可以成功地將工廠模式用于“getBillCharger”或更現代的 TestDataBuilders 或 ObjectMother 模式。
對于第二種方法,您可以只使用輔助類。如果需要在 Test 類中多次調用相同的構造邏輯,可以使用 @Before
一個重要的方面是,如果您將 tests_case_1 放在超類中,您將隱藏部分邏輯并且您的測試不會那么明顯。我更喜歡更明確和可見的測試用例,因此我會避免這種設置。

青春有我
TA貢獻1784條經驗 獲得超8個贊
事實上,最初的方法確實應用了一種設計模式,它稱為Template Method。
OTOH,這些問題本身就帶有尋找設計模式作為目標的輕微氣味。為什么要麻煩,如果他們手頭已經有了滿足功能(此處:測試正確的東西)和非功能(此處:將公共部分與具體部分明確分開)要求的解決方案。我會接受的一個原因是:溝通,例如:能夠為設計命名,以便同事快速了解我的意圖。
添加回答
舉報
0/150
提交
取消