存根类 测试代码 java

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

存根类 测试代码 java

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

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

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

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

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

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

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

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

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

  5. oZone3D FurMark(甜甜圈furmark显卡压力测试软件)绿色单文件版V1.9.2 | 电脑烤机测试软件

    FurMark是来自oZone3D开发的一款OpenGL基准测试工具,通过皮毛渲染算法来衡量显卡的性能,可以对显卡进行地狱一般的折磨,借此考验显卡的稳定性,就是大家常说的显卡压力测试软件,俗称甜甜圈f ...

  6. 支付宝java代码_支付宝回调JAVA版代码

    支付宝回调: 1 //这个是支付宝回调的信息 2 @RequestMapping("alipay_callback.do") 3 @ResponseBody 4 public Ob ...

  7. 存根类 测试代码 java_常规单元测试和存根–测​​试技术4

    存根类 测试代码 java 我的上一个博客是有关测试代码的方法以及讨论您做什么和不必进行测试的方法的一系列博客中的第三篇. 它基于我使用一种非常常见的模式从数据库检索地址的简单方案: -并且我提出了这 ...

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

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

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

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

最新文章

  1. 200万注册开发者,13亿全景图片,90%数据生产AI化,百度地图如何造生态?
  2. 淘宝旺铺基础版装修出专业版效果(不花钱也一样做到)
  3. JAVA源码优化、分析工具
  4. 导入hbase_HBase基础学习之bulkload了解
  5. maven学习- 私服nexus搭建
  6. centos安装python3.5_CentOS 7安装Python3.5
  7. 读书笔记(chapter18)
  8. 开启Hive的本地模式
  9. 2017 计蒜之道 初赛 第五场 A. UCloud 机房的网络搭建
  10. ExtJS学习之EditorGridPanel
  11. 《Python 100例》练习,基于Python 3.5做了一遍
  12. 浅谈iOS开发中的锁
  13. 免费客户旅程(Customer Journey Mapping) 示例总汇
  14. C语言操作Excel表格
  15. VUE:全局引入.lees文件的CSS变量
  16. APS生产排单软件模拟排程功能
  17. 百度云直链下载-Aria2(二)
  18. 绕过CDN查找真实IP方法总结
  19. 2022年房地产开发行业研究报告
  20. Call Indels/SV常用软件-搬运工

热门文章

  1. 这可能就是写代码的乐趣吧,你,也一定会爱上写代码的!
  2. Photoshop的基本操作
  3. Servlet使用适配器模式进行增删改查案例(Emp.java)
  4. android 监听安装来源_Flutter插件开发之APK自动安装
  5. Spring boot (5):Spring data jpa 的使用
  6. gwt格式_活性GWT
  7. 创建react应用程序_使用SpringWebFlux的React式Web应用程序
  8. payara 创建 集群_高可用性(HA),会话复制,多VM Payara群集
  9. jgroups_JGroups:无需额外基础架构的领导人选举
  10. js内存泄露 垃圾回收_Java内存体系结构(模型),垃圾回收和内存泄漏