存根类 测试代码 java_有关为旧版代码创建存根的更多信息–测试技术7
存根類 測試代碼 java
在我的上一個博客中 ,我談到了如何處理行為不佳的不可測試的 (1) SitePropertiesManager 類,以及如何通過提取接口來創(chuàng)建存根。 但是,如果由于舊類的源代碼已被鎖定在第三方JAR文件中而無法訪問它,會發(fā)生什么情況? 答案是您真正沒有想到的事情之一,但是當您看到它時,您會意識到它是顯而易見的。為了證明這一點,我將重新編寫上一個博客中的代碼 ? (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文件中。
我之前提出的有關(guān)使遺留代碼更具可測試性的所有觀點仍然存在:您需要使用SpringFactoryBean實現(xiàn)進行依賴注入,并停止依賴靜態(tài)工廠方法getInstance ()。 您還需要一種創(chuàng)建存根的方法,該存根允許您將代碼與我們的流氓類愉快使用的數(shù)據(jù)庫和文件系統(tǒng)隔離開 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);} }這里的主要思想是,現(xiàn)在我可以將存根實例多態(tài)注入到我的AddressService類中,而無需知道它已經(jīng)被欺騙了。
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);} }您可能會問:為什么不總是使用繼承,答案是該技術(shù)的缺點是測試代碼與野生的SitePropertiesManager類緊密耦合。 在這種情況下,這并不是什么大問題,作為一名務(wù)實的程序員,我想這并不重要,因為擁有整潔,經(jīng)過測試和可靠的代碼比擁有松散耦合的代碼(但沒有單元測試)要好。
(1)設(shè)計時未考慮單元測試。
(2)源代碼可從GitHub獲得:
git://github.com/roghughe/captaindebug.git
參考:來自Captain Debug's Blog的 JCG合作伙伴 Roger Hughes提供了有關(guān)為遺留代碼創(chuàng)建存根的更多信息-測試技術(shù)7 。
相關(guān)文章 :
- 測試技巧–不編寫測試
- 端到端測試的濫用–測試技術(shù)2
- 您應(yīng)該對什么進行單元測試? –測試技術(shù)3
- 常規(guī)單元測試和存根–測??試技術(shù)4
- 使用模擬的單元測試–測試技術(shù)5
- 為舊版代碼創(chuàng)建存根-測試技術(shù)6
- 為什么要編寫單元測試-測試技巧8
- 一些定義–測試技術(shù)9
翻譯自: https://www.javacodegeeks.com/2011/12/more-on-creating-stubs-for-legacy-code.html
存根類 測試代碼 java
總結(jié)
以上是生活随笔為你收集整理的存根类 测试代码 java_有关为旧版代码创建存根的更多信息–测试技术7的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 斯密马赛是什么意思 斯密马赛的意思
- 下一篇: 喜结连理是什么意思 喜结连理的意思