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 浅谈

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wimb

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值