Mockito 基础学习

一 Mockito 概念图


Mockito 基础学习_第1张图片
概念图

二 前要知识


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、获取

        
            org.mockito
            mockito-all
            1.8.5
            test
        

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);

你可能感兴趣的:(Mockito 基础学习)