有關為舊版代碼創建存根的更多信息–測試技術7

上一個博客中 ,我談到了如何處理行為不佳的不可測試的 (1) SitePropertiesManager 類,以及如何通過提取接口來創建存根。 但是,如果由于舊類的源代碼已被鎖定在第三方JAR文件中而無法訪問它,會發生什么情況? 答案是您真正沒有想到的事情之一,但是當您看到它時,您會意識到它是顯而易見的。

為了證明這一點,我將重寫上一個博客中的代碼 ? (2)測試我的簡單AddressService 。 情況相同, AddressService必須加載站點屬性并決定是否返回地址:

public Address findAddress(int id) {logger.info("In Address Service with id: " + id);Address address = Address.INVALID_ADDRESS;if (isAddressServiceEnabled()) {address = addressDao.findAddress(id);address = businessMethod(address);}logger.info("Leaving Address Service with id: " + id);return address;}private boolean isAddressServiceEnabled() {return new Boolean(propManager.findProperty("address.enabled"));}

…除了,我要假裝SitePropertiesManager被鎖定在JAR文件中。

之前提出的有關使遺留代碼更具可測試性的所有觀點仍然存在:您需要使用SpringFactoryBean實現轉向依賴注入,并停止依賴靜態工廠方法getInstance ()。 您還需要一種創建存根的方法,該存根允許您將代碼與我們的流氓類愉快使用的數據庫和文件系統隔離開 SitePropertiesManager 。 在這種情況下,由于該類被鎖定在一個JAR文件中,因此您不能簡單地提取一個接口,您必須更加狡猾并使用繼承。 使用繼承編寫存根是很簡單的,并且只需要幾行代碼,如下所示:

public class StubSitePropertiesUsingInheritance extends SitePropertiesManager {private final Map<String, String> propMap = new HashMap<String, String>();public void setProperty(String key, String value) {propMap.put(key, value);}@Overridepublic String findProperty(String propertyName) {return propMap.get(propertyName);}
}

這里的主要思想是,現在我可以將存根實例多態注入到我的AddressService類中,而無需知道它已經被愚弄了。

public class LegacyAddressServiceUsingInheritanceTest {private StubAddressDao addressDao;private StubSitePropertiesUsingInheritance stubProperties;private LegacyAddressService instance;@Beforepublic void setUp() {instance = new LegacyAddressService();stubProperties = new StubSitePropertiesUsingInheritance();instance.setPropertiesManager(stubProperties);}@Testpublic void testAddressSiteProperties_AddressServiceDisabled() {/* Set up the AddressDAO Stubb for this test */Address address = new Address(1, "15 My Street", "My Town", "POSTCODE", "My Country");addressDao = new StubAddressDao(address);instance.setAddressDao(addressDao);stubProperties.setProperty("address.enabled", "false");Address expected = Address.INVALID_ADDRESS;Address result = instance.findAddress(1);assertEquals(expected, result);}@Testpublic void testAddressSiteProperties_AddressServiceEnabled() {/* Set up the AddressDAO Stubb for this test */Address address = new Address(1, "15 My Street", "My Town", "POSTCODE", "My Country");addressDao = new StubAddressDao(address);instance.setAddressDao(addressDao);stubProperties.setProperty("address.enabled", "true");Address result = instance.findAddress(1);assertEquals(address, result);}
}

您可能會問:為什么不總是使用繼承,答案是該技術的缺點是測試代碼與野生的SitePropertiesManager類緊密耦合。 在這種情況下,這并不是什么大問題,而且作為一個務實的程序員,我想這并不重要,因為擁有整潔,經過測試和可靠的代碼要比擁有松散耦合的代碼更好,但沒有單元測試。


(1)設計時未考慮單元測試。
(2)源代碼可從GitHub獲得:

git://github.com/roghughe/captaindebug.git

參考: Captain Debug's Blog上的JCG合作伙伴 Roger Hughes提供了更多有關為遺留代碼創建存根的測試技術7 的信息 。

相關文章 :

  • 測試技巧–不編寫測試
  • 端到端測試的濫用–測試技術2
  • 您應該對什么進行單元測試? –測試技術3
  • 常規單元測試和存根–測??試技術4
  • 使用模擬的單元測試–測試技術5
  • 為舊版代碼創建存根–測試技術6
  • 為什么要編寫單元測試–測試技巧8
  • 一些定義–測試技術9

翻譯自: https://www.javacodegeeks.com/2011/12/more-on-creating-stubs-for-legacy-code.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374369.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374369.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374369.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python動態時鐘代碼_python繪制動態時鐘

桌面時鐘項目描述 1、使用turtle庫繪制時鐘外形及表針&#xff1b; 2、使用datetime獲取系統時間&#xff1b; 3、時鐘動態顯示 turtle庫基本命令 1、turtle.setup()函數&#xff1a;用于啟動一個圖形窗口&#xff0c;它有四個參數turtle.setup(width, height, startx, starty)…

Ajax 學習 - 基礎學習

《AJax - Async Javascript and xml - 異步的JavaScript和XML》 一、基礎認識 AJax技術的目的&#xff1a;實現頁面無刷新數據動態更改 優點: 不需要插件支持 提供WEB程序的功能 優秀的用戶體驗 減輕服務器帶寬的負擔 缺點&#xff1a; 破壞瀏覽器的前進與后退 搜索引擎…

STM32F1筆記(十三)SPI

SPI&#xff1a;Serial Peripheral interface&#xff0c;串行外圍設備接口。 SPI接口一般使用4條線通信&#xff1a; MISO主設備數據輸入&#xff0c;從設備數據輸出。 MOSI主設備數據輸出&#xff0c;從設備數據輸入。 SCLK時鐘信號&#xff0c;由主設備產生。 從圖中可以…

紅帽Openshift:入門–云中的Java EE6

現在有一段時間&#xff0c;我正在研究“云”。 研究它的功能&#xff0c;它可以做什么&#xff0c;為什么我們應該切換到“云”&#xff0c;進行討論&#xff0c;與RealDolmen的云專家maartenballiauw等人交談。 我已經在Google App Engine&#xff08;用于Java&#xff09;上…

python自定義函數參數_python自定義函數的參數之四種表現形式

&#xff08;1&#xff09;def a(x,y):print x,y 這是最常見的定義方式&#xff0c;調用該函數&#xff0c;a(1,2)則x取1&#xff0c;y取2&#xff0c;形參與實參相對應&#xff0c;如果a(1)或者a(1,2,3)則會報錯 &#xff08;2&#xff09;def a(x,y3):print x,y 提供了默認值…

osg添加紋理示例

轉自http://www.cnblogs.com/ylwn817/articles/1976851.html #include <osgDB/ReadFile>#include <osgViewer/Viewer> #include <osg/Node>#include <osg/Geode>#include <osg/Geometry>#include <osg/Group>#include <osg/Texture2D&g…

2.運算符

Swift 支持大部分標準 C 語言的運算符&#xff0c;分為一元、二元和三元運算符。 一元運算符對單一操作對象操作&#xff08;如 -a&#xff09;。一元運算符分前置運算符和后置運算符&#xff0c;前置運算符需緊跟在操作對象之前&#xff08;如 !b&#xff09;&#xff0c;后置…

C語言開發筆記(二)volatile

volatile常用于多線程共享資源和嵌入式軟件的中斷。 &#xff08;一&#xff09;嵌入式軟件中斷中volatile的應用 volatile unsigned short g_timer3_count 0;void TIM3_IRQHandler(void) {if (TIM_GetITStatus(TIM3, TIM_IT_Update) ! RESET){TIM_ClearITPendingBit(TIM3, T…

在WebLogic 12c上運行RichFaces 4.1.0.Final

您可能已經注意到&#xff0c;我只是喜歡JSF。 不僅是Mojarra的規范和參考實現&#xff0c;而且是市場上最具創意的組件套件。 這是我一直以來最喜歡的PrimeFaces &#xff0c;當然還有RichFaces 。 這就是為什么在這里找到“在xxx上運行xxx”帖子的原因:)今天是我的RichFaces和…

maven 私服的setting.xml配置

1 <?xml version"1.0" encoding"UTF-8"?>2 <settings xmlns"http://maven.apache.org/SETTINGS/1.0.0" 3 xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation"http://m…

python中的運算符_Python 中的神秘運算符

今天我們來講講 Python 里一個不為眾人所知的運算符。你可能會覺得疑惑&#xff1a;還有我不知道的運算符&#xff1f;別急著下結論&#xff0c;先往下看看再說。 在 Python3.5 中通過 PEP465https://www.python.org/dev/peps/pep-0465 加入了 運算符&#xff0c;也就是矩陣相乘…

input type:text輸入框點擊輸入,文字消失

<input name"Header1$txbsearch" type"text" value"18912345678" id"Header1_txbsearch" class"txbindex" οnfοcus"if (value 18912345678){value }" οnblur"if (value ){value18912345678}" sty…

C語言開發筆記(一)自動轉換和強制轉換

整型數據和實行數據之間可以進行運算&#xff0c;而且字符型數據可以和整型數據通用&#xff0c;所以整型、實型、字符型數據之間也是可以進行運算的&#xff0c;但在運算處理之前&#xff0c;不同類型的數據要事先轉換成同一種數據類型。轉換方法有兩種&#xff1a;自動轉換和…

Apache Shiro:簡化應用程序安全性

考慮到JAVA已有10多年的歷史了&#xff0c;對于需要在其應用程序中內置身份驗證和授權的應用程序開發人員來說&#xff0c;選擇的數量非常少。 在JAVA和J2EE中&#xff0c;JAAS規范是一種嘗試解決安全性的問題。 盡管JAAS用于身份驗證&#xff0c;但授權部分卻過于繁瑣而無法使…

Maven 導出依賴Jar,生成source.jar,javadoc.jar

下載最新版的Maven http://maven.apache.org/download.cgi 解壓到本地文件夾新建環境變量 MAVEN_HOME maven解壓目錄在path加入 %MAVEN_HOME%/bin;需要確保已經有Java環境變量 &#xff08;打開cmd java -version,javac -version兩個命令看正常不&#xff09;一、導出到默認目…

python提取包含特定字符串的行_python語言----txt中搜索特定字符串所在行

打開IDLE(python)&#xff0c;并新創建一個py文件&#xff0c;編輯內容為&#xff1a; 本示例演示如何在一個txt文件中搜索特定的字符串&#xff0c;并將其行顯示# 1. 打開文件# 2. 讀取行信息# 3. 判斷是否包含關鍵詞# 4. 不包含則循環操作&#xff0c;包含的話將行顯示并退出…

asp.net 分布式應用開發

Net Framework推出的許多新技術為上述任務的實現提供了相對簡單的解決方案。其中&#xff0c;基于SOAP的Web Service在處理分布式應用時具有比傳統的DCOM/CORBA明顯的優點&#xff0c;結合基于Web的ASP.NET頁面開發技術和SQL Server數據存儲技術&#xff08;或Xml文檔&#xff…

Spring Data JPA的持久層

1.概述 本文將重點介紹Spring 3.1&#xff0c;JPA和Spring Data的持久層的配置和實現。 有關使用基于Java的配置和項目的基本Maven pom設置Spring上下文的分步介紹&#xff0c;請參閱本文 。 持久性與春天 系列 &#xff1a; 第1部分 – 具有Spring 3.1和Hibernate的持久層 …

C語言開發筆記(三)自加和自減

看到一段代碼&#xff0c;被坑了。 #include <stdio.h>int main(void) {int a 7;printf("%d\n", a);printf("%d\n", a--);printf("%d\n", -a);printf("%d\n", -a--);printf("%d\n", a);return 0; } 結果為 -a的邏輯…

求解數獨回溯算法

實現的java代碼如下&#xff08;該算法只是將結果打印輸出&#xff0c;并沒有對原數組實現更改&#xff09;&#xff1a; //判斷a[i][j]取值val是否有效public boolean isValid(int[][] a, int i, int j, int val){//判斷是否跟同行沖突for(int j10;j1<9;j1){if(a[i][j1]val…