日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Mockito、Mock、Spy、Captor和InjectMocks入門

概述

本文將介紹Mockito庫的以下注釋:@Mock、@Spy、@Captor和@InjectMocks。

成都創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),寒亭企業(yè)網(wǎng)站建設(shè),寒亭品牌網(wǎng)站建設(shè),網(wǎng)站定制,寒亭網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,寒亭網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

啟用Mockito注釋

  • MockitoJUnitRunner

第一個(gè)選項(xiàng)是用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)建和注入模擬實(shí)例,而無需手動(dòng)調(diào)用Mockito.Mock。

在以下示例中,我們將在不使用@Mock注釋的情況下手動(dòng)創(chuàng)建一個(gè)模擬的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)有實(shí)例。

在以下示例中,在不使用@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實(shí)例。

在以下示例中,我們將在不使用@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)建一個(gè)ArgumentCaptor實(shí)例:

@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字段自動(dòng)注入到測試對象中。

在以下示例中,我們將使用@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注入一個(gè)mock:

@Mock
Map wordMap;

@Spy
MyDictionary spyDic = new MyDictionary();

然而,Mockito不支持向Spy中注入mock,以下測試導(dǎo)致異常:

@Test 
public void whenUseInjectMocksAnnotation_thenCorrect() { 
    Mockito.when(wordMap.get("aWord")).thenReturn("aMeaning"); 

    assertEquals("aMeaning", spyDic.getMeaning("aWord")); 
}

如果我們想將mock與spy一起使用,我們可以通過構(gòu)造函數(shù)手動(dòng)注入mock:

MyDictionary(Map wordMap) {
    this.wordMap = wordMap;
}

我們現(xiàn)在可以手動(dòng)創(chuàng)建Spy,而不是使用注解:

@Mock
Map wordMap; 

MyDictionary spyDic;

@BeforeEach
public void init() {
    MockitoAnnotations.openMocks(this);
    spyDic = Mockito.spy(new MyDictionary(wordMap));
}

現(xiàn)在測試將通過。

使用注解時(shí)遇到NPE

通常,當(dāng)我們試圖實(shí)際使用@Mock或@Spy注解的實(shí)例時(shí),我們可能會(huì)遇到NullPointerException:

public class MockitoAnnotationsUninitializedUnitTest {

    @Mock
    List mockedList;

    @Test(expected = NullPointerException.class)
    public void whenMockitoAnnotationsUninitialized_thenNPEThrown() {
        Mockito.when(mockedList.size()).thenReturn(1);
    }
}

大多數(shù)情況下,發(fā)生這種情況只是因?yàn)槲覀兺泦⒂肕ockito注解。

因此,想要使用Mockito注解時(shí),我們都必須采取額外的步驟進(jìn)行初始化。

結(jié)論

Mockito的注解最大限度地減少了重復(fù)的mock創(chuàng)建代碼,使測試更具可讀性。

@InjectMock對于注入@Spy和@Mock實(shí)例都是必要的。


新聞標(biāo)題:Mockito、Mock、Spy、Captor和InjectMocks入門
轉(zhuǎn)載源于:http://www.5511xx.com/article/cdcejhj.html