Mockito
文章目录
简介
Mockito是一个java测试框架,它提供mock的创建,验证,打桩。
在单元测试中,可能会依赖外部资源,比如数据库、RPC接口等,mockito可以不真正依赖外部资源,模拟特定的返回结果,验证被测单元逻辑正确性。junit单元测试请看junit单元测试总结
使用场景
- 提前创建测试
- TDD(测试驱动开发)
- 为无法访问的资源编写测试
- …
打桩(Stub),翻译并不完全准确,stub表示,提前设置调用某个方法时会做出的反应。
使用
- 替换外部依赖
- 执行测试
- 验证测试代码是否正确执行
准备工作
maven依赖
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>3.4.0</version>
<scope>test</scope>
</dependency>
文档:mockito
创建mock对象
这是使用Mock的第一步,所有对原对象执行的操作都在Mock对象上执行,这里返回的对象是代理后的对象,并不是真实的List。
List list=Mockito.mock(ArrayList.class);
验证mock对象是否执行了某些操作
list.add(1);
list.add(2);
Mockito.verify(list).add(1);//验证通过
Mockito.verify(list).add(5);//验证未通过,因为没有执行过该操作
打桩
打桩就是模拟一些函数调用的反应。
Mockito.when(list.get(1)).thenReturn(3);
Assert.assertEquals(list.get(1),3);
Mockito.when(list.get(1)).thenReturn(4);
Assert.assertEquals(list.get(1),4);
- 默认情况下,对于有返回值的方法,Mock返回null,原始/原始包装器值或空集合。例如,对于int/Integer为0,对于boolean/Boolean为false。
- 可以进行多次打桩,但是以最后一次为准。
- 一次打桩,可多次调用
参数匹配器
Mockito.when(list.get(Mockito.anyInt())).thenReturn("hi");//只要传入任何int,返回hi
Assert.assertEquals("hi",list.get(1));//hi
Assert.assertEquals("hi",list.get(999));//hi
Mockito.when(list.contains(Mockito.isA(One.class))).thenReturn(true);//只要传入String类型,就返回hello
Assert.assertTrue(list.contains("hello"));//hello
Assert.assertTrue(list.contains(1));//发生错误
- 参数匹配器是为了更加灵活的进行验证和打桩,可以自定义
注意:如果在一个方法中使用参数匹配器,那么该方法的所有参数都要使用参数匹配器,验证和打桩都是如此,例如
A a=Mockito.mock(A.class);
//Mockito.when(a.add(Mockito.anyInt(),1)).thenReturn(2);//出错
Mockito.when