新聞中心
概述
本文將介紹Mockito庫的以下注釋:@Mock、@Spy、@Captor和@InjectMocks。

成都創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設,寒亭企業(yè)網(wǎng)站建設,寒亭品牌網(wǎng)站建設,網(wǎng)站定制,寒亭網(wǎng)站建設報價,網(wǎng)絡營銷,網(wǎng)絡優(yōu)化,寒亭網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
啟用Mockito注釋
- MockitoJUnitRunner
第一個選項是用MockitoJUnitRunner注釋JUnit測試:
@ExtendWith(MockitoExtension.class)
public class MockitoAnnotationUnitTest {
...
}- MockitoAnnotations.openMocks()
或者,我們可以通過調(diào)用
MockitoAnnotations.openMocks()以編程方式啟用Mockito注釋:
@BeforeEach
public void init() {
MockitoAnnotations.openMocks(this);
}@Mock
Mockito中使用最廣泛的注釋是@Mock。我們可以使用@Mock創(chuàng)建和注入模擬實例,而無需手動調(diào)用Mockito.Mock。
在以下示例中,我們將在不使用@Mock注釋的情況下手動創(chuàng)建一個模擬的ArrayList:
@Test
public void whenNotUseMockAnnotation_thenCorrect() {
List mockList = Mockito.mock(ArrayList.class);
mockList.add("one");
Mockito.verify(mockList).add("one");
assertEquals(0, mockList.size());
Mockito.when(mockList.size()).thenReturn(100);
assertEquals(100, mockList.size());
}或者使用@mock注釋注入mock:
@Mock
List mockedList;
@Test
public void whenUseMockAnnotation_thenMockIsInjected() {
mockedList.add("one");
Mockito.verify(mockedList).add("one");
assertEquals(0, mockedList.size());
Mockito.when(mockedList.size()).thenReturn(100);
assertEquals(100, mockedList.size());
} @Spy
現(xiàn)在讓我們看看如何使用@Spy注解來監(jiān)視現(xiàn)有實例。
在以下示例中,在不使用@spy注釋的情況下創(chuàng)建受監(jiān)視列表:
@Test
public void whenNotUseSpyAnnotation_thenCorrect() {
List spyList = Mockito.spy(new ArrayList());
spyList.add("one");
spyList.add("two");
Mockito.verify(spyList).add("one");
Mockito.verify(spyList).add("two");
assertEquals(2, spyList.size());
Mockito.doReturn(100).when(spyList).size();
assertEquals(100, spyList.size());
} 使用@spy注釋:
@Spy
List spiedList = new ArrayList();
@Test
public void whenUseSpyAnnotation_thenSpyIsInjectedCorrectly() {
spiedList.add("one");
spiedList.add("two");
Mockito.verify(spiedList).add("one");
Mockito.verify(spiedList).add("two");
assertEquals(2, spiedList.size());
Mockito.doReturn(100).when(spiedList).size();
assertEquals(100, spiedList.size());
} @Captor
接下來,我們來看看如何使用@Captor注解來創(chuàng)建ArgumentCaptor實例。
在以下示例中,我們將在不使用@Captor注釋的情況下創(chuàng)建ArgumentCaptor:
@Test
public void whenNotUseCaptorAnnotation_thenCorrect() {
List mockList = Mockito.mock(List.class);
ArgumentCaptor arg = ArgumentCaptor.forClass(String.class);
mockList.add("one");
Mockito.verify(mockList).add(arg.capture());
assertEquals("one", arg.getValue());
} 使用@Captor來創(chuàng)建一個ArgumentCaptor實例:
@Mock
List mockedList;
@Captor
ArgumentCaptor argCaptor;
@Test
public void whenUseCaptorAnnotation_thenTheSame() {
mockedList.add("one");
Mockito.verify(mockedList).add(argCaptor.capture());
assertEquals("one", argCaptor.getValue());
}@InjectMocks
現(xiàn)在,讓我們討論如何使用@InjectMocks注解將mock字段自動注入到測試對象中。
在以下示例中,我們將使用@InjectMocks將mock wordMap注入MyDictionary dic:
@Mock
Map wordMap;
@InjectMocks
MyDictionary dic = new MyDictionary();
@Test
public void whenUseInjectMocksAnnotation_thenCorrect() {
Mockito.when(wordMap.get("aWord")).thenReturn("aMeaning");
assertEquals("aMeaning", dic.getMeaning("aWord"));
} 類MyDictionary:
public class MyDictionary {
Map wordMap;
public MyDictionary() {
wordMap = new HashMap();
}
public void add(final String word, final String meaning) {
wordMap.put(word, meaning);
}
public String getMeaning(final String word) {
return wordMap.get(word);
}
} 向Spy注入Mock
我們可能想向Spy注入一個mock:
@Mock
Map wordMap;
@Spy
MyDictionary spyDic = new MyDictionary(); 然而,Mockito不支持向Spy中注入mock,以下測試導致異常:
@Test
public void whenUseInjectMocksAnnotation_thenCorrect() {
Mockito.when(wordMap.get("aWord")).thenReturn("aMeaning");
assertEquals("aMeaning", spyDic.getMeaning("aWord"));
}如果我們想將mock與spy一起使用,我們可以通過構造函數(shù)手動注入mock:
MyDictionary(Map wordMap) {
this.wordMap = wordMap;
} 我們現(xiàn)在可以手動創(chuàng)建Spy,而不是使用注解:
@Mock
Map wordMap;
MyDictionary spyDic;
@BeforeEach
public void init() {
MockitoAnnotations.openMocks(this);
spyDic = Mockito.spy(new MyDictionary(wordMap));
} 現(xiàn)在測試將通過。
使用注解時遇到NPE
通常,當我們試圖實際使用@Mock或@Spy注解的實例時,我們可能會遇到NullPointerException:
public class MockitoAnnotationsUninitializedUnitTest {
@Mock
List mockedList;
@Test(expected = NullPointerException.class)
public void whenMockitoAnnotationsUninitialized_thenNPEThrown() {
Mockito.when(mockedList.size()).thenReturn(1);
}
} 大多數(shù)情況下,發(fā)生這種情況只是因為我們忘記啟用Mockito注解。
因此,想要使用Mockito注解時,我們都必須采取額外的步驟進行初始化。
結論
Mockito的注解最大限度地減少了重復的mock創(chuàng)建代碼,使測試更具可讀性。
@InjectMock對于注入@Spy和@Mock實例都是必要的。
網(wǎng)站題目:Mockito、Mock、Spy、Captor和InjectMocks入門
網(wǎng)頁網(wǎng)址:http://m.fisionsoft.com.cn/article/cdcejhj.html


咨詢
建站咨詢
