日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

测试抽象类和模板方法模式

發布時間:2023/12/3 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 测试抽象类和模板方法模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
摘自Wikipedia,“模板方法定義了算法的程序框架。 子類可以覆蓋一個或多個算法步驟,以允許不同的行為,同時確保仍然遵循總體算法。”

通常,此模式由兩個或多個類組成,一個是提供模板方法(非抽象)的抽象類,該模板方法具有對由一個或多個具體子類實現的抽象方法的調用。

模板抽象類和具體實現通常位于同一項目中,但是根據項目范圍,這些具體對象將被實現到另一個項目中。

在這篇文章中,我們將看到在外部項目上實現具體類時如何測試模板方法模式,或更一般的如何測試抽象類。

讓我們看一個簡單的模板方法模式示例。 考慮一個負責接收整數向量并計算歐幾里得范數的類。 這些整數可以從多個來源接收,并留給每個項目以提供一種獲取它們的方法。

模板類如下所示:

public abstract class AbstractCalculator {public double euclideanNorm() {int[] vector = this.read();int total = 0;for(int element:vector) {total+= (element*element); }return Math.sqrt(total);}public abstract int[] read(); }

現在,另一個項目可以擴展上一類,并通過提供read()方法的實現來實現抽象計算器。

public class ConsoleCalculator extends AbstractCalculator {public int[] read() {int [] data = new int[0];Scanner scanner = new Scanner(System.in);//data = read requried data from consolereturn data; }}

編寫了具體實現的開發人員將只測試read()方法,他可以“相信”抽象類的開發人員已經測試了非抽象方法。

但是,如果類是抽象的并且需要read()方法的實現,我們將如何在計算方法上編寫單元測試?

第一種方法可能是創建偽造的實現:

public class FakeCalculator extends AbstractCalculator {private int[] data;public FakeCalculator(int[] data) {this.data = data;}public int[] read() {return this.data;}}

這不是一個壞方法,但是有一些缺點:

  • 測試的可讀性較低,讀者應該知道這些假類的存在,并且必須確切地知道他們在做什么。
  • 作為測試作者,您將花費時間來實現偽類,在這種情況下,這很簡單,但是您的項目可能有多個不執行任何抽象類,甚至使用不止一個抽象方法。
  • 偽造類的行為是“硬編碼的”。

更好的方法是使用Mockito僅模擬抽象方法,同時調用非抽象方法的實現。

public class WhenCalculatingEuclideanNorm {@Testpublic void should_calculate_correctly() {AbstractCalculator abstractCalculator = mock(AbstractCalculator.class, Mockito.CALLS_REAL_METHODS);doReturn(new int[]{2,2}).when(abstractCalculator).read();assertThat(abstractCalculator.euclideanNorm(), is(2.8284271247461903));}@Testpublic void should_calculate_correctly_with_negative_values() {AbstractCalculator abstractCalculator = mock(AbstractCalculator.class, Mockito.CALLS_REAL_METHODS);doReturn(new int[]{-2,-2}).when(abstractCalculator).read();assertThat(abstractCalculator.euclideanNorm(), is(2.8284271247461903));}}

Mockito通過調用真實方法簡化了抽象類的測試,并且僅對抽象方法進行了存根處理。 看到這種情況是因為默認情況下我們正在調用真實方法,而不是使用典型的when()then()結構,而是必須使用doReturn模式。

當然,僅當您的項目不包含算法的具體實現,或者您的項目將成為另一個項目的第3方庫的一部分時,才可以使用此方法。 在其他情況下,解決問題的最佳方法是測試實現的類。

下載源代碼

參考:在One Jar to Rulem All博客上測試了我們的JCG合作伙伴 Alex Soto的抽象類(尤其是模板方法模式) 。


翻譯自: https://www.javacodegeeks.com/2012/06/testing-abstract-classes-and-template.html

總結

以上是生活随笔為你收集整理的测试抽象类和模板方法模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。