一 Mockito 概念图

二 前要知识
1、测试的类型
- Unit test : 单元测试是关注单一的类,检查这个类中的代码是否按预期正确执行
- Integration test:检查开发的模块和其它模块整合时是否正确执行
- End-to-End test:将整个系统作为一个整体,然后从用户的角度去进行测试,看系统在实际应用中是否正确执行
** 2、单元测试概念**
- 被测系统(System under test,SUT):被测系统是当前被测试的系统,目的是检查当前被测的系统是否被正确运行,根据测试系统的不同,SUT 所指代的内容也不同,可以是一个类也可以是整个系统。
- 测试依赖组件(DOC):被测系统所依赖的组件,例如:进行 UserService 的单元测试时,UserService 会依赖 UserDao ,那么 UserDao 就是 DOC
- 测试替身(Test Double):用一些功能简单的且其行为和实际对象类似的假对象来作为 SUT 的依赖对象
- Test stub:为 SUT 提供假数据的对象
- Fake object:实现了简单功能的一个假对象
- Mock object:用来模拟实际的对象,并校验当前的 mock object 的方法是否符合预期
- Dummy object:在测试中并不使用,但是为了测试代码正常的编译/运行而添加的对象(比如仅仅填充参数列表)
- Test spy:包装一个真实的 Java 对象,并返回一个包装后的新对象,对这个新对象的所有方法进行调用时,都会委派为实际的对象。
三 Mockito
1、获取
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.8.5</version>
<scope>test</scope>
</dependency>
2、Mockito 相关 API
- 验证行为
import static org.mockito.Mockito.*;
//创建mock
List mockedList = mock(List.class);
//使用 mock 对象,mock 对象调用过的方法都会被记录下来
mockedList.add("one");
mockedList.clear();
//验证,mock 对象调用了 add("one") 和 clear()
verify(mockedList).add("one");
verify(mockedList).clear();
- stubbing
//可以mock具体的类,而不仅仅是接口
List list = mock(list.class);
//存根(stubbing),当调用 mock 对象的 get(0) 时会返回 first,
当调用 get(1) 时,会抛出一个异常
when(list.get(0)).thenReturn("first");
when(list.get(1)).thenThrow(new RuntimeException());
// 验证存根的调用
verify(list).get(0);
- 参数匹配器
//anyInt() 表示参数是任意的 int
when(mockedList.get(anyInt())).thenReturn("element");
//做验证
verify(mockedList).get(anyInt());
- 验证调用次数
//使用mock
mockedList.add("once");
mockedList.add("twice");
mockedList.add("twice");
mockedList.add("three times");
mockedList.add("three times");
mockedList.add("three times");
//下面两个验证是等同的 - 默认使用times(1)
verify(mockedList).add("once");
verify(mockedList, times(1)).add("once");
//验证精确调用次数
verify(mockedList, times(2)).add("twice");
verify(mockedList, times(3)).add("three times");
//使用using never()来验证. never()相当于 times(0),表示 add 没有被调用过
verify(mockedList, never()).add("never happened");
//使用 atLeast()(至少)/atMost()(至多)来验证
verify(mockedList, atLeastOnce()).add("three times");
verify(mockedList, atLeast(2)).add("five times");
verify(mockedList, atMost(5)).add("three times");
- 使用 Exception 做 void 的存跟
doThrow(new RuntimeException()).when(mockedList).clear();
//下面会抛出 RuntimeException:
mockedList.clear();
- 确保交互从未在mock对象上发生
//使用mock - 仅有mockOne有交互
mockOne.add("one");
//普通验证
verify(mockOne).add("one");
//验证方法从未在mock对象上调用
verify(mockOne, never()).add("two");
//验证其他mock没有交互
verifyZeroInteractions(mockTwo, mockThree);
- @mock注解
public class MockTest {
@Mock private ArticleCalculator calculator;
重要的是: 需要在基类或者test runner中的加入:
MockitoAnnotations.initMocks(testClass);
网友评论