0


Mock&Mockito使用手册

基础概念

mock 测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。这个虚拟的对象就是mock对象。mock对象就是真实对象在调试期间的代替品;

Mock 对象:模拟对象的概念就是我们想要创建一个可以替代实际对象的对象,这个模拟对象要可以通过特定参数调用特定的方法,并且能返回预期结果;

Stub 桩:桩指的是用来替换具体功能的程序段。桩程序可以用来模拟已有程序的行为或是对未完成开发程序的一种临时替代;

使用

依赖:

<dependency>  
    <groupId>org.mockito</groupId>  
    <artifactId>mockito-core</artifactId>  
    <version>1.9.5</version>  
    <scope>test</scope>  
</dependency> 

1. Mock 对象

// @InjectMocks注解标注的属性,可以自动注入标记@Mock、@Spy等注解的属性值
public class UserServiceTest {  
  
    @InjectMocks  
    private UserServiceImpl userService;  
  
    @Mock  
    private UserDao mockUserDao;  
  
    @Before  
    public void setUp() {  
        MockitoAnnotations.initMocks(this);  
    }  
}

/* 静态方法Mock */
//mock一个静态类,被测试代码依赖的类
mockStatic(PersonDao.class);
//当调用PersonDao.findStatic()方法,返回特定的值
when(PersonDao.testStatic(Mockito.anyString())).thenReturn("not find");

2. 打桩

设置 Mock 对象期望和返回值

/* 表示第一次调用 someMethod() 返回 value1 第二次调用返回 value2 */
when(mock.someMethod()).thenReturn(value1).thenReturn(value2);  
when(mock.someMethod()).thenReturn(value1, value2);  
/* 也可以设置两次 */
when(mock.someMethod()).thenReturn(value1);
when(mock.someMethod()).thenReturn(value2);

// 其他写法
/* 表示第一次调用 someMethod() 返回 value1 第二次调用返回 value2 */
doReturn(value1).doReturn(value2).when(mock).someMethod();  
/* 若返回 void,则设置为 doNothing() */
doNothing().when(mock).someMethod();

/* void 方法的预期设定 */
doNothing().when(mock).someMethod(); 

/* 方法返回异常 */
when(mock.someMethod()).thenThrow(new RuntimeException()); 

/* 对 void 方法进行方法预期设定 */
doThrow(new RuntimeException()).when(mock).someMethod();

方法设定返回异常

/* 当调用 someMethod() 方法时会抛出异常 */
when(mock.someMethod()).thenThrow(new RuntimeException());
/* 对 void 方法设定 */  
doThrow(new RuntimeException()).when(mock).someMethod();  

参数匹配 any() anyInt()

/*  any(User.class),匹配任意User对象;
    anyString()匹配任意字符串;
    anyInt()匹配任意int型 
*/
when(list.get(anyInt())).thenReturn("hello");

3. 校验

/* 验证方法被调用并且被调用了 1 次 */
verify(mock1).get(0);
mock1.get(0);
/* 验证方法调用两次 */
verify(mock1, times(2)).get(0);
/* 验证方法从未被调用过 */
verify(mock2, never()).get(0);
/* 验证方法 100 毫秒内调用两次 */
verify(mock1, timeout(100).times(2)).get(anyInt());

参考

Mock 官网

Mock工具Mockito教程

Mock 单元测试利器

Mockito 浅谈

标签: 单元测试

本文转载自: https://blog.csdn.net/qq_31278903/article/details/127379423
版权归原作者 Wimb 所有, 如有侵权,请联系我们删除。

“Mock&Mockito使用手册”的评论:

还没有评论