- Mockito 是一个模拟测试框架。主要功能是模拟类/对象的行为。
- Mockito 一般用于控制调用外部的返回值,让我们只关心和测试自己的业务逻辑。
- 我们引入了 junit 来编写断言。断言是测试的核心。
- 我们通过 mock 函数生成了一个 HttpService 的 mock 对象(这个对象是动态生成的)。
- 通过 when .. thenReturn 指定了当调用 mock对象的 queryStatus 方法时,返回 1 ,这个叫做打桩。
- org.mockito.Mockito 的 mock 方法可以模拟类和接口。
- 注意,mock 对象的方法的返回值默认都是返回类型的默认值。例如,返回类型是 int,默认返回值是 0;返回类型是一个类,默认返回值是 null。
- @Mock 注解可以理解为对 mock 方法的一个替代。
- 使用该注解时,要使用MockitoAnnotations.initMocks 方法,让注解生效。
- 对于精确匹配,还可以用 eq
- 可以使用 Mockito.anyInt() 匹配所有类型为 int 的参数:
- 如果参数匹配即生命了精确匹配,也声明了模糊匹配;又或者同一个值的精确匹配出现了两次,使用时会匹配哪一个?
- 会匹配符合匹配条件的最新声明的匹配。
- spy 和 mock不同,不同点是:
- spy 的参数是对象示例,mock 的参数是 class。
- 被 spy 的对象,调用其方法时默认会走真实方法。mock 对象不会。
- 构造函数注入
- 设值函数注入(set函数)
- 属性注入
- thenReturn 用来指定特定函数和参数调用的返回值。
- thenReturn 中可以指定多个返回值。在调用时返回值依次出现。若调用次数超过返回值的数量,再次调用时返回最后一个返回值。
- thenThrow 用来让函数调用抛出异常。
- thenThrow 中可以指定多个异常。在调用时异常依次出现。若调用次数超过异常的数量,再次调用时抛出最后一个异常。
- 如果一个对象的方法的返回值是 void,那么不能用 when .. thenThrow 让该方法抛出异常
- doAnswer 的作用和 thenAnswer 相同,但使用方式不同:
- 示例
- doNothing 用于让 void 函数什么都不做。因为 mock 对象中,void 函数就是什么都不做,所以该方法更适合 spy 对象。
- 示例
- 见 Mockito @Mock 注解 。主要作用是让 @Mock、@Spy 等注解生效。
- 使用 reset 方法,可以重置之前自定义的返回值和异常。
Mockito 使用 verify 校验是否发生过某些操作
- 使用 verify 可以校验 mock 对象是否发生过某些操作
- verify 配合 time 方法,可以校验某些操作发生的次数
- Mockito 的 mockingDetails 方法会返回 MockingDetails 对象,它的 isMock 方法可以判断对象是否为 mock 对象,isSpy 方法可以判断对象是否为 spy 对象。
- 根据 JUnit 单测隔离 ,当 Mockito 和 JUnit 配合使用时,也会将非static变量或者非单例隔离开。
- PowerMock 是一个增强库,用来增加 Mockito 、EasyMock 等测试库的功能。
- Mockito 默认是不支持静态方法
- 可以用 Powermock 弥补 Mockito 缺失的静态方法 mock 功能
- PowerMockRunner 支持 Mockito 的 @Mock 等注解
- 上面我们用了 PowerMockRunner ,MockitoJUnitRunner 就不能用了。但不要担心, @Mock 等注解还能用。