Java Unit Test - Mocktio

本文介绍了Java单元测试中Mockito框架的使用,包括环境配置、模拟对象的生成、打桩和验证行为,以及Mockito注解的详细解析,帮助开发者有效编写测试代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java Unit Test - Mocktio

Mockito是专门用于有效编写某种测试的框架,是Java的最佳模拟框架,经常与JUnit一起使用,用来模拟构造需要测试的对象,解决对象间的依赖关系。

在下面的情形,可能需要使用模拟对象来代替真实对象:

真实对象的行为是不确定的(例如,当前的时间或当前的温度);
真实对象很难搭建起来;
真实对象的行为很难触发(例如,网络错误);
真实对象速度很慢(例如,一个完整的数据库,在测试之前可能需要初始化);
真实的对象是用户界面,或包括用户界面在内;
真实的对象使用了回调机制;
真实对象可能还不存在;
真实对象可能包含不能用作测试(而不是为实际工作)的信息和方法。

单元测试三部曲 --> 链接?

1 环境信息

JDK : 8
Junit : 4.12
Mocktio : 2.28.2

2 使用方法

模拟被测试对象 --> 对非关键方法进行打桩 --> 验证被测对象行为或结果是否符合预期

示例:

	//模拟被测试对象
	List mockList = mock(List.class);
	//打桩:当要获取mockList长度时,返回20
	when(mockList.size()).thenReturn(20)
	//验证:有两次行为,结果是一个int
	verify(mockList, times(2)).get(anyInt())

3 原理

3.1 生成模拟对象的原理

根据被测对象类型生成一个继承这个类型的类 --> 实例化生成的类- -> 得到mock对象

3.2 打桩的原理

  • 1 打桩完毕会生成一个Answer对象,存放到一个链表里。后面调用对应的方法的时候,就会从这个链表内找到对应的Answer对象,从中获取对应的值返回。
  • 2 对2.1中生成的派生类设置hook回调方法,方法的返回值及打桩时给的值,所有的方法调用最终都会交由MockHandlerImpl.handle
  • 3 Mockito会假定每个方法调用需要被打桩,生成一个和这个方法调用相对应的OngoingStubbing对象,将这个对象暂时存起来。
    当when方法执行的时候,就会取出这个暂存的OngoingStubbing对象返回,这样我们就能在这上面打桩(调用thenReturn等方法),返回我们需要的值了。
	when(verifyService.validate(any())).thenReturn(true);
	doNothing().when(calculateService).print(isA(Integer.class), isA(Integer.class));

3.2 验证行为结果的原理

分阶段分步骤的执行:

  • 1 Mockito会记录下要验证的对象,以及要验证的参数。
  • 2 在执行方法调用的时候,取出要验证的对象、验证的参数并执行验证。
    verify(mock).someMethod();
    verify(mock, times(10)).someMethod();
    verify(mock, atLeastOnce()).someMethod();

4 项目搭建

  • 1 maven添加依赖:
<dependency>
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值