Mockito 指南-note

    https://www.letianbiji.com/java-mockito/mockito-hello-world.html   Mocktio 入门  
  1. Mockito 是一个模拟测试框架。主要功能是模拟类/对象的行为。
  2. Mockito 一般用于控制调用外部的返回值,让我们只关心和测试自己的业务逻辑。
  3. 我们引入了 junit 来编写断言。断言是测试的核心。
  4. 我们通过 mock 函数生成了一个 HttpService 的 mock 对象(这个对象是动态生成的)。
  5. 通过 when .. thenReturn 指定了当调用 mock对象的 queryStatus 方法时,返回 1 ,这个叫做打桩。
  Mocktio 使用 mock 方法模拟类和接口
  1. org.mockito.Mockito 的 mock 方法可以模拟类和接口。
  2. 注意,mock 对象的方法的返回值默认都是返回类型的默认值。例如,返回类型是 int,默认返回值是 0;返回类型是一个类,默认返回值是 null。
  3. @Mock 注解可以理解为对 mock 方法的一个替代。
  4. 使用该注解时,要使用MockitoAnnotations.initMocks 方法,让注解生效。
  Mockito mock 泛型类、泛型接口   Mockito 参数匹配
  1. 对于精确匹配,还可以用 eq
  2. 可以使用 Mockito.anyInt() 匹配所有类型为 int 的参数:
  Mockito 参数匹配顺序
  1. 如果参数匹配即生命了精确匹配,也声明了模糊匹配;又或者同一个值的精确匹配出现了两次,使用时会匹配哪一个?
  2. 会匹配符合匹配条件的最新声明的匹配。
    Mockito spy 和 @Spy 注解
  1. spy 和 mock不同,不同点是:
  • spy 的参数是对象示例,mock 的参数是 class。
  • 被 spy 的对象,调用其方法时默认会走真实方法。mock 对象不会。
2.对于@Spy,如果发现修饰的变量是 null,会自动调用类的无参构造函数来初始化。 3. 所以下面两种写法是等价的:   Mockito @InjectMocks 注解注入 mock 对象 mockito 会将 @Mock、@Spy 修饰的对象自动注入到 @InjectMocks 修饰的对象中。 注入方式有多种,mockito 会按照下面的顺序尝试注入:
  1. 构造函数注入
  2. 设值函数注入(set函数)
  3. 属性注入
    Mockito 使用 thenReturn 设置方法的返回值  
  1. thenReturn 用来指定特定函数和参数调用的返回值。
  2. thenReturn 中可以指定多个返回值。在调用时返回值依次出现。若调用次数超过返回值的数量,再次调用时返回最后一个返回值。
  Mockito 使用 thenThrow 让方法抛出异常
  1. thenThrow 用来让函数调用抛出异常。
  2. 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 让方法抛出异常
  1. 如果一个对象的方法的返回值是 void,那么不能用 when .. thenThrow 让该方法抛出异常
  Mockito 使用 doAnswer 自定义方法处理逻辑  
  1. doAnswer 的作用和 thenAnswer 相同,但使用方式不同:
  2. 示例
Random random = mock(Random.class); doAnswer(new Answer() { @Override public Object answer(InvocationOnMock invocation) throws Throwable { return 1; } }).when(random).nextInt();   Mockito 使用 doNothing 让 void 函数什么都不做
  1. doNothing 用于让 void 函数什么都不做。因为 mock 对象中,void 函数就是什么都不做,所以该方法更适合 spy 对象。
  2. 示例
ExampleService exampleService = spy(new ExampleService()); exampleService.hello(); // 会输出 Hello // 让 hello 什么都不做 doNothing().when(exampleService).hello(); exampleService.hello(); // 什么都不输出   Mockito 使用 MockitoJUnitRunner 运行 JUnit 测试     Mockito 使用 MockitoAnnotations.initMocks 让 @Mock 等注解生效  
  1. 见 Mockito @Mock 注解 。主要作用是让 @Mock、@Spy 等注解生效。
  Mockito 使用 reset 重置对象
  1. 使用 reset 方法,可以重置之前自定义的返回值和异常。
  Mockito 使用 thenCallRealMethod 调用 spy 对象的真实方法  
    Mockito 使用 verify 校验是否发生过某些操作
  1. 使用 verify 可以校验 mock 对象是否发生过某些操作
  2. verify 配合 time 方法,可以校验某些操作发生的次数
    Mockito 使用 mockingDetails 判断对象是否为 mock对象、spy 对象
  1. Mockito 的 mockingDetails 方法会返回 MockingDetails 对象,它的 isMock 方法可以判断对象是否为 mock 对象,isSpy 方法可以判断对象是否为 spy 对象。
    Mockito 测试隔离
  1. 根据 JUnit 单测隔离 ,当 Mockito 和 JUnit 配合使用时,也会将非static变量或者非单例隔离开。
  Mockito 使用 PowerMock 让 Mockito 支持静态方法
  1. PowerMock 是一个增强库,用来增加 Mockito 、EasyMock 等测试库的功能。
  2. Mockito 默认是不支持静态方法
  3. 可以用 Powermock 弥补 Mockito 缺失的静态方法 mock 功能
  4. PowerMockRunner 支持 Mockito 的 @Mock 等注解
  5. 上面我们用了 PowerMockRunner ,MockitoJUnitRunner 就不能用了。但不要担心, @Mock 等注解还能用。
    Mockito 临时 mock 对象    
上一篇:【Mock平台】测试开发实战01-开篇PRD和需求详细


下一篇:开发工具:让前后端联调不再争吵——Apifox