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

存根类 测试代码 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/358950.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

skywalking使用方法_skywalking 6.2配置相关和使用

1、关于日志和项目名配置: 日志可在探针agent.config里面配置也可以在外面配置 在外面配置方式为: -javaagent:/data/path/skywalking-agent.jarlogging.file_nameagent_passport.log,logging.dir/data/applogs/skyagent/ -Dskywalking.agent.service_namepassport由于是docker…

【APICloud系列|14】xcode下载地址

下载地址&#xff1a;https://developer.apple.com/download/more/ 这个是使用苹果Mac下载xcode用于上架appstore打包的软件。 Windows的Xcode&#xff1a;在PC上安装Xcode的5种方法 参考帖子&#xff1a;https://blog.csdn.net/qq_36666115/article/details/86485305

kail利用msf工具对MS12-020漏洞进行渗透测试

kail利用msf工具对MS12-020漏洞进行渗透测试 MS12-020全称Microsoft Windows远程桌面协议RDP远程代码执行漏洞 kail利用msf工具对MS12-020漏洞进行渗透测试&#xff1a; 实验环境&#xff1a; 工具&#xff1a;metasploit 靶机两台&#xff1a;windows 7sp1和kali2020 攻…

float在python中的书写形式错误的是_在Python3.7.1中,编写简单的GAN时,“TypeError:”float“对象不能解释为整数”错误...

我对Python和编程是全新的。我试图编写一个简单的GAN来使用Keras数据集(参见下面的教程超链接)。我收到两个警告&#xff0c;然后是一个错误&#xff1a;TypeError: float object cannot be interpreted as an integer.任何帮助都将不胜感激。在详细信息&#xff1a;Python 3.7…

将25k行C#转换为Java的经验教训

由于各种原因&#xff0c;我最近完成了一个将复杂的财务应用程序从C&#xff03;转换为Java的项目。 港口的原因大部分是非技术性的&#xff0c;相反&#xff0c;这是有关企业的一项战略举措。 这是一次有趣的经历&#xff0c;我在此过程中吸取了一些经验教训&#xff0c;可以…

Spark K-Means

K-Means&#xff08;K均值&#xff09; 介绍 K-Means是被应用的最广泛的基于划分的聚类算法&#xff0c;是一种硬聚类算法&#xff0c;属于典型的局域原型的目标函数聚类的代表。算法首先随机选择k个对象&#xff0c;每个对象初始地代表一个簇的平均值或者中心。对于剩余的每个…

【APICloud系列|30】苹果MAC电脑取消辅助功能-语音识别

方法&#xff1a;快捷键 “commandF5”即可。 原因是不小心出现这个辅助功能&#xff0c;导致我进入苹果商店输入密码不能正常切换大小写&#xff0c;快捷键 “commandF5”就可以正常使用

kail利用msf工具对ms17-010(永恒之蓝)漏洞入侵渗透Win7

kail利用msf工具对ms17-010&#xff08;永恒之蓝&#xff09;漏洞入侵渗透Win7 前言&#xff1a; 提到操作系统漏洞&#xff0c;大家肯定听说过耳熟能详的永恒之蓝&#xff08;MS17-010&#xff09;了&#xff0c;他的爆发源于WannaCry勒索病毒的诞生。 该病毒是不法分子利用…

mysql 删除版本信息_linux 删除mysql

写作背景明天项目上线&#xff0c;今天晚上在客户的机房进行网站的部署&#xff0c;在安装mysql的时候出现了一个问题&#xff0c;就是死活安装不上&#xff0c;说已经存在mysql,最后分析错误信息才知道&#xff0c;原来是centos 6.3 自带安装了mysql 5.1&#xff0c;因为我是通…

微信连接WIFI并关注公众号的方法

分享一个改造路由器来实现微信连wifi关注公众已经成为一种高效的引流方法。 前提是先有自己的路由器、认证的公众号&#xff08;服务号或订阅号&#xff09;、开通过门店小程序。 1.进入公众号后以此选择“微信连wifi”→“设备管理”→详情&#xff0c;拿到公众号的三个参数…

《你的灯亮着吗》读后感1

《你的灯亮着吗》这本书主要讲了几个实际的问题&#xff0c;在还没读这本书时对这本书有一定的了解&#xff0c;所以在读这本书时也是有一定的目的&#xff0c;在这本书中可以学到好多的东西&#xff0c;在作者分析问题和解决问题中我们可以找到好多新奇的思路。 我已读这本书有…

kali利用msf工具对ms08-067漏洞入侵靶机(win xp2)

kali利用msf工具对ms08-067漏洞入侵靶机&#xff08;win xp2&#xff09; 漏洞简介 MS08-067漏洞将会影响Windows 2000/XP/Server 2003/Vista/Server 2008的各个版本&#xff0c;甚至还包括测试阶段的Windows 7 Pro-Beta。 如果用户在受影响的系统上收到特制的 RPC 请求&…

tomcat mysql如何优化_Tomcat+Mysql高并发配置优化讲解

1.Tomcat优化配置(1)更改Tomcat的catalina.bat将java变成server模式&#xff0c;增大jvm的内存&#xff0c;在文件开始位置增加setJAVA_OPTS-server -Xms1024m -Xmx2048m -Xss512K -XX:PermSize128m-XX:MaxPermSize256msetCATALINA_OPTS-server -Xms512m -Xmx512m如下图&#x…

DEV控件中GridView中的复选框与CheckBox实现联动的全选功能

最初的界面图如图1-1&#xff08;全选框ID&#xff1a; cb_checkall DEV控件名称&#xff1a;gcCon &#xff09;&#xff1a; 要实现的功能如下图&#xff08;1-2 1-3 1-4&#xff09;及代码所示&#xff1a; 图1-2 图1-3 图1-4 O(∩_∩)O哈哈~ 不要着急哦&#xff0c;看清…

CSDN转载别人文章的操作

说在前面 对于喜欢逛CSDN的人来说&#xff0c;看别人的博客确实能够对自己有不小的提高。有时候看到特别好的博客想转载&#xff0c;但是不能一个字一个字的敲&#xff0c;一张图片一张图片的截图&#xff0c;这样怪麻烦也浪费时间。这时候我们就想转载别人的博客&#xff0c;那…

分享我工作10年收藏的程序员技术网站

其实很多程序员最头疼的事情,就是找学习资料或面试题,我这里,就给大家推荐一些,我赞了6年的优质技术网站,都是我精心挑选的,涵盖:4个算法网站,7个调优排错工具网站,4个问答社区,4个教程网站,4个代码协作平台,都是大家学习IT路上的好帮手,对技术提升有很大帮助,而…

WildFly Swarm:使用Java EE构建微服务

“完美无缺&#xff0c;不是在没有其他可添加的东西时&#xff0c;而是在没有其他东西要带走时实现的” Antoine de Saint-Exupery 法国作家安托万德圣艾修伯里 &#xff08; Antoine de Saint-Exupery &#xff09;的这句话是为了证明通常少花钱多。 对于建筑师&#xff0c;艺…

python编程头文件_python头文件的编程风格

python头文件的编程风格发布时间&#xff1a;2020-09-03 10:23:25来源&#xff1a;亿速云阅读&#xff1a;96作者&#xff1a;小新小编给大家分享一下python头文件的编程风格&#xff0c;希望大家阅读完这篇文章后大所收获&#xff0c;下面让我们一起去探讨吧&#xff01;本文主…

《Code:The Hidden Language Of Computer Hardware and Software》 ——笔记

怎么由逻辑电路实现二进制的加法 首先二进制的加法可以拆解为两个步骤&#xff1a;加与进位。 加法01001110进位01000101加这一步骤可以由异或门来完成&#xff0c;进位这一步骤则可以用与门来完成。 但是由这两个逻辑门只能组成一个半加器&#xff0c;输入2个值&#xff0c;输…

关于一个域名下如何更换网站

说明&#xff1a;建立在有域名、服务器、两个网站的基础之上。 背景&#xff1a; 原来的网站采用的是微企点建站的方式&#xff0c;对于那种拖拉拽不懂编程的人用的&#xff0c;现在自己开发一个更为强大的功能性网站&#xff0c;想把这个新网站替换掉原来的网站&#xff0c;…