亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 junit 構建基本單元測試和抽象驗證

使用 junit 構建基本單元測試和抽象驗證

大話西游666 2021-09-12 10:37:13
假設我正在為移動應用程序構建按月訂閱收費功能,有多種收費方式??梢酝ㄟ^ 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 放在超類中,您將隱藏部分邏輯并且您的測試不會那么明顯。我更喜歡更明確和可見的測試用例,因此我會避免這種設置。


查看完整回答
反對 回復 2021-09-12
?
青春有我

TA貢獻1784條經驗 獲得超8個贊

事實上,最初的方法確實應用了一種設計模式,它稱為Template Method。

OTOH,這些問題本身就帶有尋找設計模式作為目標的輕微氣味。為什么要麻煩,如果他們手頭已經有了滿足功能(此處:測試正確的東西)和非功能(此處:將公共部分與具體部分明確分開)要求的解決方案。我會接受的一個原因是:溝通,例如:能夠為設計命名,以便同事快速了解我的意圖。


查看完整回答
反對 回復 2021-09-12
  • 2 回答
  • 0 關注
  • 130 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號