【JAVA UT】16、使用mock的3步驟

前兩節(jié)介紹了什么是mock。

這節(jié)介紹如何使用mock。

對于從沒用過mock的讀者,請先安裝Mockito。它是一個優(yōu)秀的mock框架。

使用mock的過程,就像裝一顆假牙。

讓我們跟著埃德蒙一起走進牙科醫(yī)院。

醫(yī)生診斷出埃德蒙的一顆牙已經(jīng)壞了,需要用假牙替換掉它。

一星期后,假牙做好了,裝入埃德蒙的口中。做了幾次咬合動作,又被取出,打磨打磨。再裝進去。

直到醫(yī)生認為滿意為止。

整個配假牙的過程是:1 做假牙,2 配置假牙, 3 驗證功能。

讓我們跟著埃德蒙走出醫(yī)院,走進下面這個類:

public class NameChecker {
    private NameLoader nameLoader;
    private Alarmer alarmer;
    
    public NameChecker(NameLoader loader_in, Alarmer alarmer_in) {
        nameLoader = loader_in;
        alarmer = alarmer_in;
    }

    public boolean nameIsOnServer(String addr, String name) {
        List nameList = nameLoader.download(addr);
        if (nameList.contains(name)) {
            return true;
        }
        alarmer.reportAlarm("name is not in server.");
        return false;
    }
}

NameChecker類中有一個方法nameIsOnServer,用于檢查一個名字是不是記錄在服務器中。

nameIsOnServer有兩個參數(shù),第一個參數(shù)是服務器地址,第二個參數(shù)是被檢查的名字。

如果name不在服務器中,則返回false,并且報警。

下面的這段ut,是對報警功能的驗證。

public class NameCheckerTest {
    private NameChecker nameChecker;
    private NameLoader nameLoader;
    private Alarmer     alarmer;

    @Before
    public void setUp() {
        nameLoader = mock(NameLoader.class);
        alarmer    = mock(Alarmer.class);
        nameChecker = new NameChecker(nameLoader, alarmer);
    }

    @Test
    public void shouldReportAlarm(){
        List<String> nameList = new ArrayList<String>();
        nameList.add("a");
        nameList.add("b");
        when(nameLoader.download(anyString())).thenReturn(nameList);

        String ladp_addr = "ldap://10.56.78.23:636";
        String name = "c";

        nameChecker.nameIsOnServer(ladp_addr, name);
        
        verify(nameLoader, times(1)).download(anyString());
        verify(alarmer, times(1)).reportAlarm(anyString());
    }
}

NameLoader和Alarmer是與NameChecker合作的類。在ut中,一般需要使用假的合作類,以擺脫對它們的依賴,達到測試當前類的目標。

步驟1:調(diào)用Mockito的mock語句

nameLoader = mock(NameLoader.class);
alarmer    = mock(Alarmer.class);

這就好比是做假牙。

假牙=mock(真牙)

步驟2:調(diào)用Mockito的when語句

when(nameLoader.download(anyString())).thenReturn(nameList);

這相當于打磨假牙,讓它用得舒服。

alarmer沒有相應的when語句,因為它簡單,無需打磨。

步驟3:調(diào)用Mockito的verify語句

verify(nameLoader, times(1)).download(anyString());
verify(alarmer, times(1)).reportAlarm(anyString());

這就是驗證牙齒的功能。

期望nameLoader的download方法被調(diào)用一次,alarmer的reportAlarm方法被調(diào)用一次。

實際被調(diào)用了嗎?

verify語句可以檢查出來。若符合期望,則ut狀態(tài)就是pass;不符合,則fail。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容