在上一个博客中 ,我谈到了如何处理行为不佳的不可测试的 (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

有关为旧版代码创建存根的更多信息–测试技术7相关推荐

  1. 存根类 测试代码 java_有关为旧版代码创建存根的更多信息–测试技术7

    存根类 测试代码 java 在我的上一个博客中 ,我谈到了如何处理行为不佳的不可测试的 (1) SitePropertiesManager 类,以及如何通过提取接口来创建存根. 但是,如果由于旧类的源 ...

  2. 存根类 测试代码 java_为旧版代码创建存根-测试技术6

    存根类 测试代码 java 任何阅读此博客的人都可能已经意识到,目前我正在开发一个项目,其中包含大量的旧代码,这些旧代码庞大,扩展且编写时从未进行过任何测试. 在使用此遗留代码时,有一个行为非常差的类 ...

  3. 为旧版代码创建存根–测试技术6

    任何阅读此博客的人都可能已经意识到,目前我正在开发一个包含大量旧代码的项目,这些旧代码庞大,扩展且编写时从未进行过任何测试. 在使用此遗留代码时,有一个行为异常的类非常普遍,整个团队都一次又一次地犯错 ...

  4. 癌症新知和癌症真相的区别_旧版代码是癌症

    癌症新知和癌症真相的区别 It's far too often that I see people shying away from newest technologies in the spirit ...

  5. 将Spring集成到旧版应用程序中

    所有Spring开发人员喜欢做的事情之一就是将Spring塞入他们正在工作的任何应用程序中–这是我生活中的罪恶感之一:您看到一些代码,认为它是垃圾,因为它包含几个众所周知的反模式,然后想想如果这个应用 ...

  6. 维护旧项目_为什么您的旧版软件难以维护-以及如何处理。

    维护旧项目 Believe it or not, some organizations still rely on legacy software to carry out operations ev ...

  7. 图标出问题_同是Office365,为什么你的软件图标还是旧版的?

    为什么你的office365套件最新版的图标还是旧版? 是新版图标还没向正式版用户推送吗? 我的office365的账号有问题吗? 难道是我打开的方式不对吗? 旧版图标 新版图标 打开产品信息一看你的 ...

  8. win10图标变白纸_同是Office365,为什么你的软件图标还是旧版的?

    为什么你的office365套件最新版的图标还是旧版? 是新版图标还没向正式版用户推送吗? 我的office365的账号有问题吗? 难道是我打开的方式不对吗? 旧版图标 新版图标 打开产品信息一看你的 ...

  9. stripe支付 旧版 charge付款方式 demo代码

    stripe支付 旧版 charge付款方式 demo代码 stripe支付 新版paymentIntent(付款意图) demo代码 可参考. 特点: 1.实现客户绑卡,解卡等 2.全部由服务端进行 ...

最新文章

  1. python正确的变量名称_Python基础之变量的命名
  2. Linux命令-安装zip和unzip命令
  3. 《Go语言圣经》学习笔记 第十一章 测试
  4. C++的const修饰
  5. 谷歌AI:根据视频生成深度图,效果堪比激光雷达
  6. mysql图片数据类型_Mysql数据类型简介(大概了解)
  7. Mac上emacs使用ggtags
  8. 证券期货信息安全等级保护测评
  9. Apple原装扫描二维码指定区域
  10. 黑马Java微服务十次方项目不加密视频
  11. 用python写网络爬虫-英文翻译
  12. 模拟游戏--艾伦·图灵的传奇人生
  13. 解决 googel 无法直接跳转网页打开搜索结果
  14. C语言实现一个简单的矩阵运算器
  15. Python 列表元素的排序
  16. zigbee芯片cc2430资料
  17. 计算机控制的仓库定位系统,(边江文档教材)智能立体仓库物品定位的plc自动控制系统.doc...
  18. Android 360度全景照片展示
  19. 敏捷项目的史诗与迭代
  20. 顶点计划:996问题讨论

热门文章

  1. apache ignite_Kubernetes集群上的Apache Ignite和Spring第3部分:测试应用程序
  2. qt4.8创建.pri_注意Java 8的[Pri​​mitive] Stream.iterate()中的递归
  3. mongodb上限集合_用Java创建MongoDB上限集合
  4. java 登陆验证失败_使用Java 8流进行快速失败的验证
  5. Apache Camel 3.1 –即将推出更多骆驼核心优化
  6. 比较Java REST文档框架
  7. zk ui_高级ZK:异步UI更新和后台处理–第2部分
  8. JUnit规则–引发异常时执行附加验证
  9. openshift用户管理_OpenShift Express Web管理控制台:入门
  10. gwt-2.8.2下载_GWT EJB3 Maven JBoss 5.1集成教程