天天看點

簡記Mock測試架構

MOCK (模拟,模仿)

<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>3.5.11</version>
<scope>test</scope>
</dependency>
      
  1. mock的目的和作用: 模拟一些在應用中不容易構造或者比較複雜的對象,進而把測試與測試邊界以外的對象隔離開,類似于容器。
  2. Mockito實作原理: 通過CGLib在運作時為每一個被mock的類或者對象動态生成一個代理對象,傳回預先設計的結果。
  3. Stub打樁: 即在Mockito中使用when().thenReturn()這種文法來定義對象方法和參數輸入,并且制定結果輸出
  • ​ 對于static和final方法,不能進行打樁操作,
  • 如果連續對同一個方法打樁,則隻會使用最新的一次。
  1. 內建Mockito的基本步驟
  1. 标記被Mock的類或者對象,生成代理對象
  2. 通過Mockito API定制代理對象的行為
  3. 調用代理 對象的方法,獲得預先設計的結果

Mockito架構的具體步驟

  • 初始化mock的對象

在測試類前注解 @RunWith(MockitoJUnitRunner.class)

在@Mock注解的對象後,以及@Test注解之前聲明
@Before
public void setUp( ) throws Exception{
MockitoAnnotations.initMocks(this);

 }      
  • 上述兩種初始化方式二選一即可
  • mock對象的使用
  1. Mockito.when(...).thenReturn(...); //打樁, 當when中的方法以及指定的輸入執行時,會直接傳回指定的内容,而其他被mock的方法以及其他輸入都會直接傳回預設值;

  2. Mockito.when (...).thenCallRealMethod(... ); //此時會執行被Mock對象中的真實方法并且按照其實際執行傳回結果

  3. 驗證調用次數:

    Mockito.verify(mockObject,Mockito.times()).methodName(anyString()); //驗證methodName方法執行了多少次

  4. 驗證調用順序:

    InOrder inOrder = Mockito.inOrder(mockObject); inOrder.verify(mockObject).methodName(); inOrder.verify(mockObject).methodName();

  5. 局部模拟

    通過Mockito.spy() 生成可局部模拟的對象,其餘情況都保持真實情況,例如有一個類Hello,有 Hello spy=Mockito.spy(new Hello() ) //生成局部模拟對象 Mockito.when(spy.method2("sss")).thenReturn("gg"); //實際執行,但是傳回的時候被替換了 assertEquals("gg", spy.method2("sss")); //模拟執行并傳回 assertEquals("s2", spy.method2("s")); //按照真實情況執行并傳回

    并不執行方法,而是按照指定傳回值傳回

    Mockito.doReturn(....).when(spy).method(....);