一.Mock的使用场景:
比如以下场景:
1. mock掉外部依赖的应用的HSF service的调用,比如uic,tp 的hsf服务依赖。
2. 对DAO层(访问mysql、oracle、tair、tfs等底层存储)的调用mock等。
3. 对系统间异步交互notify消息的mock。
4. 对method_A里面调用到的method_B 的mock 。
5. 对一些应用里面自己的 class(abstract, final, static),interface,annotation ,enum,native等的mock。
二. Mock工具的原理:
mock工具工作的原理大都如下:
1. record阶段:录制期望。也可以理解为数据准备阶段。创建依赖的class 或interface或method ,模拟返回的数据,及调用的次数等。
2. replay阶段:通过调用被测代码,执行测试。期间会invoke 到 第一阶段record的mock对象或方法。
3. verify阶段:验证。可以验证调用返回是否正确。及mock的方法调用次数,顺序等。
三. 当前的一些Mock工具的比较:
历史曾经或当前比较流行的Mock工具有EasyMock、jMock、Mockito、Unitils Mock、PowerMock、jmockit等工具。
他们的功能对比如下:
来源:https://code.google.com/p/jmockit/
从这里可以看到,当前为什么jmockit为什么这么火爆了!所以我们的UT中的mock工具也选择了目前无所不能的jmockit。
而在使用的过程中,感觉到jmockit的 Auto-injection of mocks 及 Special fields for "any" argument matching 及各种有用的 Annotation 给测试代码精简和测试效率提升带来了实实在在的好处。
四. Jmockit的简介:
JMockit 是用以帮助开发人员编写测试程序的一组工具和API,它(https://code.google.com/p/jmockit/)完全基于 Java 5 SE 的 java.lang.instrument 包开发,内部使用 ASM 库来修改Java的Bytecode。正是由于基于instrument,可以修改字节码。所以这也是它强大的原因。
Jmockit可以mock的种类包含了:1.class(abstract, final, static) ;2.interface ;3.enum ;4.annotation ;5.native 。
Jmockit 有两种mock的方式:
1. Behavior-oriented(Expectations & Verifications) ;
2. State-oriented(MockUp<GenericType>) 。
通俗点讲,Behavior-oriented是基于行为的mock,对mock目标代码的行为进行模仿,更像黑盒测试。State-oriented 是基于状态的mock,是站在目标测试代码内部的。可以对传入的参数进行检查、匹配,才返回某些结果,类似白盒。而State-oriented的 new MockUp基本上可以mock任何代码或逻辑。非常强大。
以下是jmockit的APIs和tools:
可以看到jmockit常用的Expectation、NonStrictExpectations 期望录制 及Annotation @Tested、@Mocked,@NonStrict、@Injectable 等简洁的mock代码风格。而且jmockit 还自带了code coverage的工具供本地UT时候看逻辑覆盖或代码覆盖率使用。
五.Jmockit的实践:
第一步:添加jmockit的jar包依赖
在refund的单元测试过程中,第一步:应用pom中引入jmockit的jar包,可以顺带引入jmockit自带的code coverage的jar。
第二步:一个完整的Jmockit的示例:
这个是对rr里面查询金额范围 queryeRange的单元测试。通过看被测代码可以看到这个方法的实现里面调用了
feeultDO = cosService.queryCodFee(delId);
这个外部的hsf依赖 获取了feeultDO 。
这个hsf调用是需要mock的。
传统的mock或ut ,对 confirmGoodsService 这个bean是需要初始化,通过spring的配置,初始化加载等 一大堆代码。
jmockit通过了注解的方式:
@Injectable
private Confervice confervice ;
一个Annotation就搞定了所有的配置,加载等问题。直接复用开发代码里面的bean,节省了大量的代码。
另外 @Tested ReferImpl reerImpl = new RImpl();
这里也用到了注解 @Tested 表示被测试的class 。
另外还有常用的注解:@Mocked,@NonStrict等。
而这段代码就是mock的核心:录制被mock的method的行为及期望返回:
new Expectations(){
{
coce.quendFee(anyLong);
result = feemock;
times = 1;
}
} ;
其中
result 可以返回任意需要的测试类型;
times 表示期望被调用的次数。
是不是看起来非常简洁明了。
而上面该段代码如果 换成基于状态的mockup 代码如下:
<图片省略>
采用MockUp的方式,可以mock任意的mock对象或方法,因为它直接改写了原method的实现逻辑,直接返回需要的数据。
这也是jmockit彪悍的地方之一。
最后数据回收,防止各个testcase的mock相互影响的方式:
Mockit.tearDownMocks();
这一步也可以省略。
还要重点介绍的就是mock期望里面的入参 any。
这个any系列的万能入参类型,也可以节省很多mock代码,可以高效的准备任何入参类型。
J
以上,一个最简单的,也最实用的jmockit的示例。
jmockit的更多,对interface及method的单元测试的示例,将在后续总结汇总。
六、 Jmockit自带的code coverage :
工程的 pom文件中引入 jmockit-coverage 后,本地eclipse启动单元测试后, 会自动统计单元测试的代码覆盖率。关于行覆盖,方法覆盖,类覆盖,分支逻辑覆盖等各种数据都可以看到。
IDE启动UT时候,加载 code coverage 组件,
<图片省略>
点击进去,可以看到具体的覆盖逻辑:
<图片省略>
其中绿色部分表示源代码被run过。
代码覆盖对指导单元测试的测试逻辑,覆盖等提供了直观的指示。
// # (转载请注明出处: http://red7sk.iteye.com/blog/1748897 ,多谢。)
以上,就是在单元测试中mock技术的应用:Jmockit的使用介绍及实际应用示例。它在单元测试中确实可以很少的代码mock掉外部依赖,提高ut的效率,并且 自带的code coverage可很方便的看到ut对被测代码的覆盖效果,指导测试设计。
相关推荐
**Jmockit详解:单元测试中的模拟神器** Jmockit是一款强大的Java库,主要用于单元测试,尤其是模拟(mocking)和验证(verifying)对象的行为。它提供了灵活且易于使用的API,使得测试复杂的代码变得更加简单,...
内容概要:本文详细介绍了利用Matlab及其Simulink工具箱实现模糊PID控制器用于温度控制系统的仿真过程。首先构建了一个简单的温度控制系统模型,采用了一阶惯性环节作为被控对象,并引入了模糊逻辑控制器(Fuzzy Logic Controller)来优化传统的PID控制效果。文中展示了具体的MATLAB代码片段,包括隶属度函数的设计、规则库的建立以及最终的仿真测试结果对比。结果显示,相较于传统PID,模糊PID能够更快地达到稳定状态并且对干扰有更好的鲁棒性。 适合人群:自动化专业学生、从事工业自动化领域的工程师和技术人员。 使用场景及目标:适用于需要提高温度控制精度和响应速度的实际工程项目中,特别是在面对非线性和不确定性较强的复杂环境时。通过学习本案例可以掌握模糊PID的基本原理及其在Matlab平台上的具体应用方法。 其他说明:文中还提到了一些实践经验,比如如何设置合理的隶属度范围以避免过度调节导致的振荡现象,以及加入随机噪声后的性能表现评估等。
cmd脚本-bat批处理-03.replacestring.zip
cmd-bat-批处理-脚本-javaDetect.zip
C语言学习 零散 易错点 例题
以下是重新表述后的内容: 单周期 MIPS CPU 的微程序地址转移逻辑设计:在单周期 MIPS CPU 架构中,微程序地址转移逻辑是关键部分。它负责根据当前微指令的执行情况以及 CPU 内部的各种状态信号,准确地计算出下一条微指令的地址。这一逻辑需要综合考虑指令类型、操作完成情况、是否发生异常等多种因素,以确保微程序能够按照正确的顺序和逻辑进行执行,从而实现 MIPS 指令的准确译码与控制。 MIPS 微程序 CPU 的设计:设计一款基于微程序控制的 MIPS CPU,其核心在于构建微程序控制器。该控制器通过存储微指令序列来实现对 CPU 各部件的控制。微指令中包含对数据通路操作的控制信号以及微程序地址转移信息。在设计过程中,需要精心设计微指令格式,使其能够高效地表示各种操作控制信息,同时合理安排微指令存储器的组织结构,确保微指令的快速读取与准确执行,从而实现 MIPS 指令集的完整功能。 MIPS 硬布线控制器的状态机设计:在采用硬布线控制方式的 MIPS CPU 中,状态机是控制器的核心组成部分。状态机根据输入的指令操作码、状态信号等信息,在不同的状态之间进行转换。每个状态对应着 CPU 在执行一条指令过程中的一个特定阶段,如取指、译码、执行、访存等。状态机的设计需要精确地定义各个状态的转换条件以及在每个状态下输出的控制信号,以确保 CPU 能够按照正确的时序和逻辑完成指令的执行过程。 多周期 MIPS 硬布线控制器 CPU 设计(排序程序):设计一款多周期 MIPS 硬布线控制器 CPU,用于运行排序程序。在这种设计中,CPU 的每个指令执行周期被划分为多个子周期,每个子周期完成指令执行过程中的一个特定操作。硬布线控制器根据指令操作码和当前周期状态,生成相应的控制信号来协调 CPU 数据通路的操作。针对排序程序的特点,需要优化控制器的设计,合理安排指令执行的周期划分
内容概要:本文详细介绍了永磁同步电机(PMSM)无位置传感器转子初始位置检测技术,重点讲解了通过正弦波信号注入实现转子初始位置的初次估计和极性判断的方法。文中不仅提供了具体的实现步骤和技术细节,还分享了仿真模型和相关参考文献,帮助读者理解和掌握这项关键技术。此外,作者对未来的研究方向进行了展望,并提出了实际应用中的改进建议。 适合人群:从事电机控制系统设计的研发人员、高校师生以及对永磁同步电机无位置传感器技术感兴趣的工程技术人员。 使用场景及目标:适用于需要深入了解和研究永磁同步电机无位置传感器转子初始位置检测技术的场合,旨在提升电机控制系统的精度和响应速度。 阅读建议:读者可以结合提供的仿真模型和参考文献进行实践操作,以便更好地理解正弦波信号注入的具体实现过程及其效果。
内容概要:本文利用COMSOL软件模拟THM(热-流体-力学)耦合作用下CO2-ECBM(增强型煤层气开采)的复杂过程,重点研究了CO2注入煤层后的驱替过程、煤体吸附膨胀变形、二元气体竞争吸附、孔隙度和渗透率的动态变化,以及甲烷产量和二氧化碳封存量之间的关系。通过多孔介质流体力学、煤体吸附膨胀理论和气体竞争吸附原理,揭示了CO2注入对煤层气开采和二氧化碳封存的影响机制。文中还附带了详细的教学视频,帮助理解和展示整个模拟过程及结果。 适合人群:从事煤炭资源开发、环境工程、地质工程及相关领域的科研人员和技术人员。 使用场景及目标:适用于需要深入了解CO2-ECBM技术的研究人员,旨在提高煤层气开采效率并评估二氧化碳封存潜力,为实际工程项目提供理论支持和优化建议。 其他说明:教学视频涵盖了从理论基础到模型建立、模拟过程展示再到结果分析的完整流程,便于学习者全面掌握相关技术和方法。
内容概要:本文详细介绍了基于PLC1200与Factory IO设计的模拟工厂及其联机仿真运行系统的构建。首先阐述了PLC程序设计,包括在TIA Portal V15.1中使用PLC1200编程语言进行控制逻辑设计,确保程序稳定性、可靠性及可维护性。接着讲解了Factory IO仿真环境的搭建,模拟真实工厂生产环境,便于实时监控设备运行状态和数据传输。最后讲述了TIA Portal V15.1与Factory IO联机仿真运行系统的运作机制,实现了PLC程序与仿真环境的无缝对接,有助于程序优化。文中还提到提供了演示视频,展示了整个设计流程和技术优势。 适合人群:从事工业自动化领域的工程师、技术人员,尤其是对PLC编程和仿真感兴趣的从业者。 使用场景及目标:适用于希望深入了解PLC与仿真软件协同工作的专业人士,旨在提高工业自动化项目的设计效率和质量。 其他说明:通过演示视频,读者能更直观地理解设计思路和技术细节,促进相关技术的学习和交流。
在大一程序设计基础课的大作业中,由于刚接触图形库,感到非常迷茫。于是临时参考了网上的一个OpenGL初学者示例 ,初步对相关知识有了些了解。在该示例代码的基础上进行了修改,删去了一些不必要的内容,同时增加了房屋的外部结构、内部家具、草地、树木、月亮以及字母等元素。此外,还增加了方向键等按键的功能,用于调整视角。最终完成的源代码以及实验报告,仅用于学习和完成作业,希望这些内容能够对你有所帮助 。
内容概要:本文详细介绍了一款基于DSP28335(TMS320F28335)的单相全桥逆变器程序,涵盖程序逻辑、开发环境、硬件配置等方面。该程序采用闭环电流控制和SPWM调制技术,确保了逆变器的高效稳定运行。文中不仅提供了完整的工程文件,还对每个关键模块如ADC采样、ePWM、PID控制等进行了详尽解释,配有大量注释,非常适合初学者学习。此外,作者还分享了开发经验和未来改进的方向。 适合人群:具备一定电力电子基础知识的新手开发者,尤其是对DSP编程感兴趣的工程师。 使用场景及目标:适用于希望深入了解单相全桥逆变器工作原理及其控制策略的学习者;目标是在掌握理论的同时,通过实践加深理解,最终能够独立开发类似的电力电子控制系统。 其他说明:文中提到的移相程序也可作为扩展学习材料,帮助读者全面了解相关技术的应用。
内容概要:本文介绍了五种优化算法——简化后的社会仿真算法(SSA)、水母群游算法(WOA)、灰狼优化算法(GWO)、粒子群优化算法(PSO)和遗传算法(GA),并通过Python代码实现了部分测试函数的求解。文中简述了每个算法的基本原理及其应用场景,并提供了SSA求解Rosenbrock函数和WOA求解Sphere函数的具体代码示例。此外,还提到为了完整实现所有23个测试函数,读者可以参考相关文献或现有库进行进一步的学习和探索。 适合人群:对优化算法感兴趣的开发者、研究人员以及有一定Python编程基础的学生。 使用场景及目标:帮助读者理解不同优化算法的工作机制,掌握利用Python实现这些算法的方法,从而能够应用于实际问题的求解中。 其他说明:虽然文中只展示了两种算法的部分代码,但鼓励读者自行尝试其余三种算法和其他测试函数,以加深理解和提高技能水平。
多片陀螺仪LSM6DS3驱动
《打地鼠游戏》由三个界面组成。界面1包含两个文本提示(“欢迎来到打地鼠游戏”和“祝您玩得开心”)、一张打地鼠的图片以及一个“开始游戏”按钮。界面2设有四个文本标签(显示时间、分数等信息)、一个画布、一个地鼠图像精灵,以及三个按钮(“开始”“暂停”“重新开始”)。界面3则有三个文本标签(显示最终得分)、一张图片和两个按钮(“再来一局”“退出”)。 游戏流程如下:在界面1点击“开始游戏”按钮后,进入界面2。在界面2,点击“开始”按钮,游戏正式开始,倒计时30秒,玩家需击打地鼠获取分数,每打中一次得一分,未打中则不得分。若点击“暂停”按钮,计时暂停;再次点击“开始”按钮,游戏继续。若点击“重新开始”按钮,则游戏重新开始,时间、分数等信息重置。当30秒倒计时结束,游戏自动跳转至界面3,显示最终得分。在界面3,玩家可选择点击“再来一局”按钮返回界面2重新开始游戏,或点击“退出”按钮结束游戏。
cmd脚本-bat批处理-4.errorlevel.zip
cmd-bat-批处理-脚本-ifCrasher.zip
基于 Skulpt.js 的在线 Python 编程学习网站.zip
内容概要:本文深入探讨了某新能源汽车项目中使用KULI软件进行热管理1D分析的过程。首先介绍了项目背景与目的,强调了热管理在新能源汽车性能中的重要性。接着详细描述了KULI软件的功能及其在该项目中的具体应用,包括针对不同工况(如环境温度、行驶速度、负载等)建立的系统模型。通过对空调系统、冷却系统等关键部分的一维仿真分析,获取了各部件的温度、压力、流量等参数,从而实现了对整车热状态的精准把控。最后,文章指出这些电子资料对新能源汽车工程师在热管理设计、匹配及分析方面的能力提升有着重要作用。 适合人群:从事新能源汽车热管理工作的工程师和技术人员。 使用场景及目标:适用于需要进行新能源汽车热管理设计、匹配及分析的实际工作中,旨在提高工程师对不同工况下车辆热状态的理解和掌控能力。 其他说明:文中涉及大量代码片段,有助于读者理解和实践模型构建及数据分析方法。
cmd-bat-批处理-脚本-jscript-listVerbs.zip