Mock: 英文意思有模仿、嘲笑的含义。
JMockit: 是一种Java类/接口/对象的Mock工具,是现在JAVA程序单元测试比较常见的方式。
Mock工具的种类: 常见的EasyMock、Mockito等。
为什么选择JMockit: 首先、它是完全以面向对象的方式提供API,其次,它是其他Mock工具的功能的集大成者,学习知识就要学习功能性比较完成的,选择JMockit时正确的选择,具体功能对比如下:
四: JMockit常用知识讲解 |
四: JMockit常用知识讲解
一: JMockit常用的知识点
(一): JMockit主要是由: 测试属性或测试参数,测试方法组成。其中测试方法又包括; 录制代码块,重放测试逻辑,验证代码块三部分。
(二) 测试属性: 既测试类中的一个属性,它作用于测试类的所有方法,可以使用JMockit中的@Mocked, @Tested, @Injectable,@Capturing进行修饰。添加上这些注解表示这个属性它的实例化,属性赋值,方法调用的返回值全部由JMockit来接管,也就是意味着可以通过录制行为来自定义测试属性的具体实现,具体图如下:
(三) 测试参数(其实就是方法的参数,跟测试属性的区别就是作用域不一样):
在测试类中参数加了JMockit的注解API(@Mocked, @Tested, @Injectable,@Capturing),原本的测试方法是不可以添加参数的,但是如果参数中添加了JMockit的注解的话,就可以在测试方法中添加参数,它表示的意思是仅作用于当前的测试方法,具体图如下:
(四): 测试方法
由录制代码块,重放测试逻辑,验证代码块三部分组成,既Record-Replay-Verification。
1、Record(录制): 即先录制某类/对象的某个方法调用,在当输入什么时,返回什么。
2、Replay(重放): 重放测试逻辑,实际上就是调用上面录制的方法
3、重放后的验证。比如验证某个方法有没有被调用,调用多少次。
二: JMockit常用API注解及区别
(一) @Mocked: 修饰类/接口时,就是告诉JMockit,生成一个被修饰类/接口的Mock对象,这个对象中方法(包含静态方法)返回默认值。即如果返回类型为原始类型(short,int,float,double,long)就返回0,如果返回类型为String就返回null,如果返回类型是其它引用类型,则返回这个引用类型的Mocked对象(就类型与生成一个假对象,这个对象里面方法逻辑不存在,可以通过录制行为去控制)。
(二) Mocked的使用场景: 测试程序依赖某个接口时,用@Mocked非常适合了。只需要@Mocked一个注解,JMockit就能帮我们生成这个接口的实例。如: 分布式系统中存在一个服务调用另一个服务的接口时,可以直接通过Mock生成实例,不需要启动微服务测试。
(三) @Injectable注解: 作用是告诉JMockit生成一个Mocked对象,但@Injectable只是针对其修饰的实例,而@Mocked是针对其修饰类的所有实例,@Injectable对类的静态方法,构造函数没有影响。因为它只影响某一个实例。
(四) @Tested: 作用是表示被测试对象。如果该对象没有赋值,JMockit会去实例化它,若@Tested的构造函数有参数,
则JMockit通过在测试属性&测试参数中查找@Injectable修饰的Mocked对象注入@Tested对象的构造函数来实例化,
不然,则用无参构造函数来实例化。除了构造函数的注入,JMockit还会通过属性查找的方式,把@Injectable对象注入到@Tested对象中。
注入的匹配规则:先类型,再名称(构造函数参数名,类的属性名)。若找到多个可以注入的@Injectable,则选择最优先定义的@Injectable对象。
(五) @Tested & @Injectable 的使用场景: 需要手工管理被测试类的依赖时,就需要用到@Tested & @Injectable。两者搭配起来用,JMockit就能帮我们轻松搞定被测试类及其依赖注入细节。
五: JMockit实战 |
五: JMockit实战
(一) 引入依赖坐标(JUnit4.x及以下用户特别注意事项,如果你是通过mvn test来运行你的测试程序 , 请确保JMockit的依赖定义出现在JUnit的依赖之前,否则会报错):
org.jmockit
jmockit
${jmockit.version}
(二) 构建需要测试的测试类
// 测试数据类,常规来说我们如果想调用这些方法则需要通过Mybatis或者其数据层操作组件才能够调用
// 但测试通过JMockit可以Mock一个Dao对象,来完成我们的需求
public interface UserDao {
Integer deleteUser(Integer id);
User getUserById(Integer id);
List getUserList();
Integer insertUser(User user);
Integer updateUser(User user);
Integer test(Integer test);
}
(三) 书写测试类:
public class JmockitDemo {
// 这是一个测试属性,使用Mock标识,表示UserDao的它的实例化,属性赋值,
// 方法调用的返回值全部由JMockit来接管,可以通过录制行为来控制属性中的行为
@Mocked
UserDao userDao;
@Test
public void testSeletById(){
User users = new User(19);
/**
-
步骤:
-
1、录制行为-Record,设置预期值
-
2、重放行为-replay,查看预期值
-
3、校验行为-verification,用于查看程序执行是否跟自己设想一直
-
注意事项:
-
你录制多少个行为,就需要在下面播放多少个行为,否则会报错: Missing 1 invocation to(缺少预期行为的调用)
*/
// 可以录制多个行为
new Expectations(){
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数软件测试工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年软件测试全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上软件测试开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注软件测试)
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注软件测试)
[外链图片转存中…(img-H10oKCg1-1713007684441)]
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!