开发背景
对于复杂的AO层或者是试用这边的FO层,如果使用easyMock来对其进行单元测试将会给测试人员带来无限的烦恼,因为该层的代码复合了很多的MO或者是外部的一些相关类,这使得easyMock的代码写起来会很麻烦,因为不仅需要mock要测试方法的参数,还要mock内部的一个自动注入属性所调用的方法,这会是一个令测试人员头疼的问题,automock工具就是为了解析这个问题而诞生的。
工具运行机制
测试人员将要测试的类的路径(文件系统的绝对路径)输入并调用工具的生成easymock代法的方法,便能将要测试的类的基础代码全部生成好,并将代码输入至控制台及复制到粘贴板,测试人员直接粘贴代码到测试文件并引入必要的包,设置必要的参数就可以了。
工具实现原理
读入java代码,通过ASTParser对java代码进行解析,从中解析出自动注入的属性以及其被调用的方法,使用模板生成工具类进行代码生成
工具实现类图
<!--[endif]-->
工具时序图
<!--[endif]-->
工具运行示例
需要测试的示例代码
public class StudentAO { private StudentManager studentManager; private InfomationManager infomationManager; public void getSameStudent(StudentDO studentDO,Boolean a){ int age=studentDO.getAge(); String name=studentDO.getName(); if(!isYoungStudent(studentDO,3)){ return; } studentManager.changeStudentAge(10); if(infomationManager.isYoungStudent(10)){ return; } studentManager.isYoungStudent(10); if(this.isSameStudent()==false){ return; } infomationManager.changeStudentAge(20); studentDO=studentManager.getStudentDO("student"); } public boolean sameStudent(StudentDO studentDO,Boolean a){ int age=studentDO.getAge(); String name=studentDO.getName(); studentManager.isYoungStudent(10); if(this.isSameStudent()==false){ return true; } infomationManager.changeStudentAge(20); studentDO=studentManager.getStudentDO("student"); return false; } private boolean isYoungStudent(StudentDO studentDO,int a){ if(studentDO.getAge()>0){ return true; } return false; } private boolean isSameStudent(){ if(studentManager.isSameStudent(null)){ return true; } return isYoungStudent(null,5); } public void setStudentManager(StudentManager studentManager) { this.studentManager = studentManager; } public void setInfomationManager(InfomationManager infomationManager) { this.infomationManager = infomationManager; } }
|
调用工具生成代码
public static void main(String args[]){ MockUtil mockUtil=new MockUtil(); String codeUrl="D:\\study\\automock\\src\\test\\java\\com\\taobao\\matrix\\automock\\util\\StudentAO.java"; try { String code=mockUtil.mockCode(codeUrl); } catch (Exception e) { e.printStackTrace(); } } 生成的代码如下 @Test public void getSameStudent_test(){ //实例化需要测试的对象 StudentAO studentAO=new StudentAO(); //参数及属性相关设置start StudentDO studentDO=EasyMock.createMock(StudentDO.class); //参数设置start //参数设置end EasyMock.replay(studentDO); //参数及属性相关设置end //参数及属性相关设置start StudentManager studentManager=EasyMock.createMock(StudentManager.class); studentManager.changeStudentAge(0); EasyMock.expectLastCall(); EasyMock.expect(studentManager.isYoungStudent(0)).andReturn(false).anyTimes(); EasyMock.expect(studentManager.getStudentDO("mocktest")).andReturn(null).anyTimes(); EasyMock.expect(studentManager.isSameStudent((com.taobao.matrix.automock.util.StudentDO)EasyMock.anyObject())).andReturn(false).anyTimes(); EasyMock.replay(studentManager); //参数及属性相关设置end //参数及属性相关设置start InfomationManager infomationManager=EasyMock.createMock(InfomationManager.class); EasyMock.expect(infomationManager.isYoungStudent(0)).andReturn(false).anyTimes(); infomationManager.changeStudentAge(0); EasyMock.expectLastCall(); EasyMock.replay(infomationManager); //参数及属性相关设置end //将属性注入start studentAO.setStudentManager(studentManager); studentAO.setInfomationManager(infomationManager); //将属性注入end //调用测试方法 studentAO.getSameStudent(studentDO,false); //assert验证区块start //assert验证区块end } @Test public void sameStudent_test(){ //实例化需要测试的对象 StudentAO studentAO=new StudentAO(); //参数及属性相关设置start StudentDO studentDO=EasyMock.createMock(StudentDO.class); //参数设置start //参数设置end EasyMock.replay(studentDO); //参数及属性相关设置end //参数及属性相关设置start StudentManager studentManager=EasyMock.createMock(StudentManager.class); EasyMock.expect(studentManager.isYoungStudent(0)).andReturn(false).anyTimes(); EasyMock.expect(studentManager.getStudentDO("mocktest")).andReturn(null).anyTimes(); EasyMock.expect(studentManager.isSameStudent((com.taobao.matrix.automock.util.StudentDO)EasyMock.anyObject())).andReturn(false).anyTimes(); EasyMock.replay(studentManager); //参数及属性相关设置end //参数及属性相关设置start InfomationManager infomationManager=EasyMock.createMock(InfomationManager.class); infomationManager.changeStudentAge(0); EasyMock.expectLastCall(); EasyMock.replay(infomationManager); //参数及属性相关设置end //将属性注入start studentAO.setStudentManager(studentManager); studentAO.setInfomationManager(infomationManager); //将属性注入end //调用测试方法 boolean booleanResult=studentAO.sameStudent(studentDO,false); //assert验证区块start //assert验证区块end }
|
相关推荐
支持将模拟/代理对自动暴露到Spring容器中。
Automod是由Autosumulation旗下的Brooks软件部门开发的,包括AutoMock、AutoStat和AutoView三个模块。AutoMod模块提供给用户一系列的物流系统模块来仿真现实世界中的物流自动化系统。 ShowFlow是一种来自英国的仿真...
假装简单的Automocker介绍此工具旨在更轻松地创建用于单元测试的被测类。 automocker 将创建一个给定类型的具体类,并使用 FakeItEasy 填充其所有依赖项。 它还具有检索伪造依赖项实例的功能,因此可以对其进行设置...
-jest Jest测试库的Gulp插件安装$ npm install gulp-jest jest用法var jest = require ( 'gulp-jest' ) . default ;...process.env.NODE_ENV 与jest CLI工具不同, gulp-jest不会自动将process.env.NODE_
NuGets实用程序 CsvHelper具有额外的功能,可以很好地... MOQ和MOQ.AutoMock参数,或模拟和自动模拟; Teste de desenvolvimento .NET(C#)-AMcom 以5个联合零售银行(UBSs)的名义实施UM Web API顾问服务。 Vocêd
OctoMock GitHub Actions测试需要模拟许多库和上下文,以真正隔离您的测试。 该库旨在简化该过程,因此您无需了解Jest模拟的来龙去脉即可快速... "automock" : false , "setupFilesAfterEnv" : [ "./setupJest.js