1. 程式人生 > >java入門學習:mockito之@Mock和@InjectMock

java入門學習:mockito之@Mock和@InjectMock

Mockito是java單元測試中,最常用的mck工具之一,提供了諸多打樁方法和註解。其中有兩個比較常用的註解,@Mock和@InjectMock,名字和在程式碼中使用 的位置都很像,對於初學者,很容易誤解。下面花一點時間,做個簡單的介紹。

介紹之前,首先要明確一點:@Mock和@InjectMock這兩個註解除了名字和使用方式比較像之外,是在功能上無任何可類比性的完全不同的東西。

@Mock:

在Mockito中用於建立mock物件,使用方法如下:

@Mock

private ClassName mockedObject;

上面程式碼建立了一個名為mockedObject,型別為ClassName的mock物件,該物件所有的方法被置空,根據測試程式碼邏輯的需要使用

@InjectMock:

這是一個注入mock物件的操作,參考如下程式碼:

@Mock

private ClassName mockedObject;

@InjectMock

private TestedClass TestedObj = new TestedClass();

這段程式碼中,@InjectMock下面聲明瞭一個待測試的物件,若該物件有型別為ClassName的成員變數,@Mock定義的mock物件將會被注入到這個待測試的物件中,既TestedObj的型別為ClassName的成員被直接賦值為mockedObject。(熟悉依賴注入的同學應該很容易理解)

補充幾點:

[email protected]

建立的是全部mock的物件,既在對具體的方法打樁之前,mock物件的所有屬性和方法全被置空(0或者null);與之對應的是@Spy這個註解,@Spy可以建立部分mock的物件,部分mock物件的所有成員方法都會按照原方法的邏輯執行,直到被打樁返回某個具體的值。@Mock和@Spy才是兩個具有可比性的概念。

2.Mokcito的mock()方法功能與@Mock相同,只是使用方式和場景不同。同樣的,@Spy也對應一個spy()方法。

[email protected]和@Spy註解的物件,均可被@InjectMock注入到待處理的物件中。