https://www.letianbiji.com/java-mockito/mockito-hello-world.html
Mocktio 入门
- Mockito 是一个模拟测试框架。主要功能是模拟类/对象的行为。
- Mockito 一般用于控制调用外部的返回值,让我们只关心和测试自己的业务逻辑。
- 我们引入了 junit 来编写断言。断言是测试的核心。
- 我们通过 mock 函数生成了一个 HttpService 的 mock 对象(这个对象是动态生成的)。
- 通过 when .. thenReturn 指定了当调用 mock对象的 queryStatus 方法时,返回 1 ,这个叫做打桩。
Mocktio 使用 mock 方法模拟类和接口
- org.mockito.Mockito 的 mock 方法可以模拟类和接口。
- 注意,mock 对象的方法的返回值默认都是返回类型的默认值。例如,返回类型是 int,默认返回值是 0;返回类型是一个类,默认返回值是 null。
- @Mock 注解可以理解为对 mock 方法的一个替代。
- 使用该注解时,要使用MockitoAnnotations.initMocks 方法,让注解生效。
Mockito mock 泛型类、泛型接口
Mockito 参数匹配
- 对于精确匹配,还可以用 eq
- 可以使用 Mockito.anyInt() 匹配所有类型为 int 的参数:
Mockito 参数匹配顺序
- 如果参数匹配即生命了精确匹配,也声明了模糊匹配;又或者同一个值的精确匹配出现了两次,使用时会匹配哪一个?
- 会匹配符合匹配条件的最新声明的匹配。
Mockito spy 和 @Spy 注解
- spy 和 mock不同,不同点是:
- spy 的参数是对象示例,mock 的参数是 class。
- 被 spy 的对象,调用其方法时默认会走真实方法。mock 对象不会。
2.对于@Spy,如果发现修饰的变量是 null,会自动调用类的无参构造函数来初始化。
3. 所以下面两种写法是等价的:
Mockito @InjectMocks 注解注入 mock 对象
mockito 会将 @Mock、@Spy 修饰的对象自动注入到 @InjectMocks 修饰的对象中。
注入方式有多种,mockito 会按照下面的顺序尝试注入:
- 构造函数注入
- 设值函数注入(set函数)
- 属性注入
Mockito 使用 thenReturn 设置方法的返回值
- thenReturn 用来指定特定函数和参数调用的返回值。
- thenReturn 中可以指定多个返回值。在调用时返回值依次出现。若调用次数超过返回值的数量,再次调用时返回最后一个返回值。
Mockito 使用 thenThrow 让方法抛出异常
- thenThrow 用来让函数调用抛出异常。
- thenThrow 中可以指定多个异常。在调用时异常依次出现。若调用次数超过异常的数量,再次调用时抛出最后一个异常。
Mockito 使用then、thenAnswer 自定义方法处理逻辑
then 和 thenAnswer 的效果是一样的。它们的参数是实现 Answer 接口的对象,在改对象中可以获取调用参数,自定义返回值。
Mockito 使用 doReturn 设置方法的返回值
doReturn 的作用和 thenReturn 相同,但使用方式不同:
MockitoAnnotations.initMocks(this); Random random = mock(Random.class); doReturn(1).when(random).nextInt();
Mockito 使用 doThrow 让方法抛出异常
- 如果一个对象的方法的返回值是 void,那么不能用 when .. thenThrow 让该方法抛出异常
Mockito 使用 doAnswer 自定义方法处理逻辑
- doAnswer 的作用和 thenAnswer 相同,但使用方式不同:
- 示例
Random random = mock(Random.class); doAnswer(new Answer() { @Override public Object answer(InvocationOnMock invocation) throws Throwable { return 1; } }).when(random).nextInt();
Mockito 使用 doNothing 让 void 函数什么都不做
- doNothing 用于让 void 函数什么都不做。因为 mock 对象中,void 函数就是什么都不做,所以该方法更适合 spy 对象。
- 示例
ExampleService exampleService = spy(new ExampleService()); exampleService.hello(); // 会输出 Hello // 让 hello 什么都不做 doNothing().when(exampleService).hello(); exampleService.hello(); // 什么都不输出
Mockito 使用 MockitoJUnitRunner 运行 JUnit 测试
Mockito 使用 MockitoAnnotations.initMocks 让 @Mock 等注解生效
- 见 Mockito @Mock 注解 。主要作用是让 @Mock、@Spy 等注解生效。
Mockito 使用 reset 重置对象
- 使用 reset 方法,可以重置之前自定义的返回值和异常。
Mockito 使用 thenCallRealMethod 调用 spy 对象的真实方法
Mockito 使用 verify 校验是否发生过某些操作
- 使用 verify 可以校验 mock 对象是否发生过某些操作
- verify 配合 time 方法,可以校验某些操作发生的次数
Mockito 使用 mockingDetails 判断对象是否为 mock对象、spy 对象
- Mockito 的 mockingDetails 方法会返回 MockingDetails 对象,它的 isMock 方法可以判断对象是否为 mock 对象,isSpy 方法可以判断对象是否为 spy 对象。
Mockito 测试隔离
- 根据 JUnit 单测隔离 ,当 Mockito 和 JUnit 配合使用时,也会将非static变量或者非单例隔离开。
Mockito 使用 PowerMock 让 Mockito 支持静态方法
- PowerMock 是一个增强库,用来增加 Mockito 、EasyMock 等测试库的功能。
- Mockito 默认是不支持静态方法
- 可以用 Powermock 弥补 Mockito 缺失的静态方法 mock 功能
- PowerMockRunner 支持 Mockito 的 @Mock 等注解
- 上面我们用了 PowerMockRunner ,MockitoJUnitRunner 就不能用了。但不要担心, @Mock 等注解还能用。
Mockito 临时 mock 对象
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)