使用mockito框架來測試私有方法

2021-09-24 11:48:40 字數 1600 閱讀 6352

這裡舉乙個稍微複雜一點的例子

前段時間在看mybatis3.5.1的原始碼,原始碼本身所帶的單元測試用到了mockito框架

一、問題說明

看到這個方法,

1. 我會想到需要傳遞乙個list。這個好辦

該類只有乙個帶參構造方法}

這幾個引數傳進去又會遇到問題,因為sqlcommand和method拿到傳的引數後做了一大堆處理;想要構造出這幾個引數並不是一件容易的事

3. 該方法不是私有方法,需要通過反射才能呼叫。這個不難

我只是為了測試converttoarray方法,順便還得看一大堆邏輯;想到這裡,可能還是會想,我還不如把這一小段**稍微改改,貼到一段新的地方,然後自己再寫個簡單的測試。假如非得要實現呢?過程見下文

二、**實現

我在執行mybatis中的單元測試方法時,發現mockito可以模擬類的返回結果。所以在這裡正好可以派上用場,**如下:

@test

public void converttoarray() throws exception };

// 1.模擬物件行為

// /* 這種寫法有問題

參考:when(mockmethodsignature.getreturntype().getcomponenttype())

.thenreturn(new string{}.getclass());*/

mockito.>when(mockmethodsignature.getreturntype()).thenreturn(new string{}.getclass());

// 2.獲取converttoarray方法

method.setaccessible(true);

system.out.println(result);

}

簡單說下,基本和開始的分析差不多:

1. 先準備好引數list

2. 【模擬物件行為】

b. 模擬出剛剛設定過的method屬性的行為,即呼叫method屬性的getreturntype()方法時,讓其方法能返回string陣列對應的class

3. 【獲取converttoarray方法】

a. 使用getdeclaredmethod獲得方法物件,設定為可訪問

b. 將先前準備好的list傳入,然後呼叫

假如要測試list的話,**類似,改下型別就行了,**如下(如果需要反覆呼叫的話,可以稍微再封裝下):

@test

public void converttoarray1() throws exception };

// 模擬物件行為

mockito.>when(mockmethodsignature.getreturntype()).thenreturn(new int{}.getclass());

// 獲取converttoarray方法

method.setaccessible(true);

system.out.println(result);

}

單元測試高階 使用 Mockito 進行測試

官方文件傳送門 mockito 官網 先來談談為什麼要用 mockito 如果某介面的功能是 根據一定邏輯往資料庫裡新增一條記錄的使用者註冊,那麼這個操作可以是認為有 的,除非你使用該介面後又進行回滾。rollback transactional顯然 spring 框架提供的上述註解可以很好的完成這...

使用mockito寫測試用例(二)

在第一篇文章中 使用mockito寫測試用例 一 介紹了使用mock寫一些的測試類。但是對於一些複雜的測試類,使用mockito還是有些困難的。但是為了覆蓋率,某些類的某些方法又必須測試得到,這就是個問題。mock的測試類無法呼叫靜態方法 使用powermock解決 如果想要mock多個層級的類,就...

提公升單元測試體驗的利器 Mockito使用總結

在編寫單元測試的時候,為了盡可能的保證隔離性,我們時常需要對某些不容易構造或者不容易獲取或者對外部環境有依賴的物件,用乙個虛擬的物件來建立以便於測試.假設你正在開發的的 中使用到了公司其他部門的介面 通過rpc服務 當編寫單元測試的時候你可能為了不讓介面真的去呼叫rpc服務而mock乙個介面的物件,...