目录
1、什么是mock测试
Mock 测试就是在测试活动中,对于某些不容易构造或者不容易获取的比较复杂的数据/场景,用一个虚拟的对象(Mock对象)来创建用于测试的测试方法。
2、为什么要进行Mock测试
Mock是为了解决不同的单元之间由于耦合而难于开发、测试的问题。所以,Mock既能出现在单元测试中,也会出现在集成测试、系统测试过程中。
Mock 最大的功能是帮你把单元测试的耦合分解开,如果你的代码对另一个类或者接口有依赖,它能够帮你模拟这些依赖,并帮你验证所调用的依赖的行为。
3、Mock适用场景
1. 需要将当前被测单元和其依赖模块独立开来,构造一个独立的测试环境,不关注被测单元的依赖对象,只关注被测单元的功能逻辑。
2. 被测单元依赖的模块尚未开发完成,而被测单元需要依赖模块的返回值进行后续处理。
3、前后端项目中,后端接口开发完成之前,接口联调
4、 依赖的上游项目的接口尚未开发完成,需要接口联调测试
5、被测单元依赖的对象较难模拟或者构造比较复杂
如: 支付业务的异常条件很多,但是模拟这种异常条件很复杂或者无法模拟.
4、代码实例
1、新建测试工程
package com.echo.mockito;
public class demo {
//新建一个测试方法
public int add(int a, int b){
return a + b;
}
}
2、构建mock测试方法
(1)、选中测试类,右键选中generate
(2)、点击test
(2)、点击ok后就会在test目录下生成对应的测试方法,和真实的目录是对应的
5、参数方法说明
@BeforeEach 用在测试前准备,测试前会构建很多的环境配置或者基础配置,都可以在这里设置。 @AfterEach 用于测试后设置。 @Mock 注解可以理解为对 mock 方法的一个替代,不会走真实的方法,模拟真实方法的行为。使用该注解时,要使用MockitoAnnotations.openMocks(this) 方法,让注解生效。 @Spy 1、被Spy的对象会走真实的方法,而mock对象不会, 2、spy方法的参数是对象实例,mock的参数是class。 @InjectMocks 用于将@Mock标记的模拟变量注入到测试类中。 MockitoAnnotations.openMocks(this) 开启mock,配合以上两个注解进行测试。一般放在@BeforeEach 中,在测试前开启,这样不用在每个方法中都的开启了。 Mockito.when(demo.add(1,2)).thenReturn(3):打桩 mock核心,可以设置要测试的方法的结果,这样就会忽略真实方法的执行结果,后续的测试都是基于打桩结果执行。 Mockito.when(demo.add(1,2)).thenThrow(new RuntimeException()); 用于模拟异常。 Assertions.assertEquals(3,demo.add(1,2)):断言 测试的主要方式,结果基于此判断。(期望值,实际值)。
6、简单测试
1、打桩测试 设置方法返回4 ,而实际执行为3 ,测试不通过。