Mockito 指南

Mockito 是一个模拟测试框架,主要功能是在单元测试中模拟类/对象的行为。

👉 所有文章
入门 引入依赖包 使用 mock 方法模拟类和接口 使用 @Mock 注解 mock 泛型类、泛型接口 参数匹配 参数匹配顺序 spy 和 @Spy 注解 @InjectMocks 注解注入 mock 对象 使用 thenReturn 设置方法的返回值 使用 thenThrow 让方法抛出异常 使用then、thenAnswer 自定义方法处理逻辑 使用 doReturn 设置方法的返回值 使用 doThrow 让方法抛出异常 使用 doAnswer 自定义方法处理逻辑 使用 doNothing 让 void 函数什么都不做 使用 MockitoJUnitRunner 运行 JUnit 测试 使用 MockitoAnnotations.initMocks 让 @Mock 等注解生效 使用 reset 重置对象 使用 thenCallRealMethod 调用 spy 对象的真实方法 使用 verify 校验是否发生过某些操作 使用 mockingDetails 判断对象是否为 mock对象、spy 对象 链式调用 测试隔离 使用 PowerMock 让 Mockito 支持静态方法 临时 mock 对象

Mockito 临时 mock 对象


如果需要临时将一个对象的内部对象替换为 mock 对象,在无法通过set和get处理内部对象的情况下,可以利用反射搞定。

Java JOOR 反射库 是一个很好用的反射库。本文用它进行临时替换。

用一个小项目作为示例:

项目结构:

.
├── build.gradle
├── settings.gradle
└── src
    ├── main
    │   ├── java
    │   │   └── demo
    │   │       ├── HttpService.java
    │   │       └── BizService.java
    │   └── resources
    └── test
        ├── java
        │   └── demo
        │       └── BizServiceTest.java
        └── resources

build.gradle 中声明的依赖:

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
    testCompile group: 'org.mockito', name: 'mockito-core', version: '2.25.1'
    testCompile group: 'org.jooq', name: 'joor-java-8', version: '0.9.7'
}

HttpService 类:

package demo;

public class HttpService {

    public int queryStatus() {
        // 发起网络请求,提取返回结果
        // 这里直接返回0
        return 0;
    }

}

BizService 类:

package demo;

public class BizService {

    private HttpService httpService = new HttpService();

    public String hello() {
        int status = httpService.queryStatus();
        if (status == 0) {
            return "你好";
        }
        else if (status == 1) {
            return "Hello";
        }
        else {
            return "未知状态";
        }
    }

}

BizServiceTest 测试类:

package demo;

import org.joor.Reflect;
import org.junit.Test;

import static org.mockito.Mockito.*;

public class BizServiceTest {

    private BizService bizService = new BizService();

    @Test
    public void testHello() {

        System.out.println( bizService.hello() );  // 输出'你好'

        // 取出原有的对象
        Object realHttpService = Reflect.on(bizService).get("httpService");

        // 创建 mock 对象,并用它替换掉 bizService 中的 httpService 对象
        HttpService mockHttpService = mock(HttpService.class);
        when(mockHttpService.queryStatus()).thenReturn(1);
        Reflect.on(bizService).set("httpService", mockHttpService);

        System.out.println( bizService.hello() );  // 输出'hello'

        // 再将原先的对象设置回去
        Reflect.on(bizService).set("httpService", realHttpService);
        System.out.println( bizService.hello() );  // 输出'你好'

    }

}

( 本文完 )

文章目录