Mockito
Mockito是一種Java Mock框架,主要就是用來做Mock測(cè)試的,它可以模擬任何Spring管理的Bean、模擬方法的返回值、模擬拋出異常等等,同時(shí)也會(huì)記錄調(diào)用這些模擬方法的參數(shù)、調(diào)用順序,從而可以校驗(yàn)出這個(gè)Mock對(duì)象是否有被正確的順序調(diào)用,以及按照期望的參數(shù)被調(diào)用。
mockito的特別之處?
Mockito的特別之處在于它是一個(gè)強(qiáng)大的用于Java開發(fā)的模擬測(cè)試框架,通過Mockito我們可以創(chuàng)建和配置Mock對(duì)象,進(jìn)而簡化有外部依賴的類的測(cè)試。Mockito提供了大量的靜態(tài)方法,用于幫助我們來mock對(duì)象,驗(yàn)證行為等等
什么是mockito的stub method?
本人的理解:就是在實(shí)際調(diào)用代碼前,我就規(guī)定它返回什么。
一個(gè)例子:
// 您可以模擬具體的類,而不僅僅是接口s
LinkedList mockedList = mock(LinkedList.class);
// 或者使用Mockito 4.10.0+更簡單
// LinkedList mockedList = mock();
// 存根(stubbing)在實(shí)際執(zhí)行之前出現(xiàn)
when(mockedList.get(0)).thenReturn("first");
// 以下打印“first”
System.out.println(mockedList.get(0));
// 下面打印“null”,因?yàn)間et(999)沒有存根
System.out.println(mockedList.get(999));
doThrow
在測(cè)試對(duì)象發(fā)生特定事件時(shí)拋出異常。
例1:
PowerMockito
.doThrow(new NotPermittedException(HttpServletResponse.SC_FORBIDDEN,
ErrorMsgResourceKeys.auth_accessDenied, "GroupPermissions", null))
.when(AdminPermissionCheck.class);
AdminPermissionCheck.checkAdminPermission(authorizationsVO, lstPermissions, true);
例2:
@Test
void whenConfigVoidRetunMethodToThrowEx_thenExIsThrown() {
MyDictionary dictMock = mock(MyDictionary.class);
doThrow(IllegalStateException.class).when(dictMock)
.add(anyString(), anyString());
assertThrows(IllegalStateException.class, () -> {
dictMock.add("word", "meaning");
});
}
mockito mock一個(gè)返回值為void的函數(shù)
最初接觸 Mockito 還思考并嘗試過如何用它來 mock 返回值為 void 的方法,然而 Google 查找到的一般都會(huì)說用 doThrow()
的辦法
doThrow(new RuntimeException()).when(mockObject).methodWithVoidReturn();
因?yàn)闊o法使用常規(guī)的 when(mockObject.foo()).thenReturn(...)
的方法。
當(dāng)時(shí)我就納悶,為何我想 mock 一個(gè)返回值為 void 的方法,卻是在模擬拋出一個(gè)異常,現(xiàn)在想來如果一個(gè)返回值為 void 的方法,為何要去 mock 這個(gè)方法呢?
回想一個(gè)我們要 mock 一個(gè)方法的意圖是什么:
- 在特定輸入?yún)?shù)的情況下期待需要的輸出結(jié)果(返回值)
- 在方法拋出某種類型異常調(diào)用者作出的反應(yīng)
對(duì)于 void 返回值的方法,如果要驗(yàn)證有沒有被調(diào)用過幾次可以在事后用 verify()
方法去斷言。所以基本上對(duì)于 void 返回值的方法一般可不用去 mock 它,只需用 verify() 去驗(yàn)證,或者就是像前面一樣模擬出現(xiàn)異常時(shí)的情況。
解決單元測(cè)試Mockito模擬方法內(nèi)new對(duì)象的問題
解決單元測(cè)試Mockito模擬方法內(nèi)new對(duì)象的問題_mockito new_半斤米粉闖天下的博客-CSDN博客
記PowerMockito whenNew的一個(gè)坑_Brain_L的博客-CSDN博客
@PrepareForTest后面應(yīng)該加上被測(cè)試的類,而不是要whenNew的類,被這個(gè)坑過兩次了,特此記錄下。
doReturn().when()與when().thenReturn()
java - doReturn().when()與when().thenReturn() - 成長之路 - SegmentFault 思否
doReturn().when()是無副作用的。
when().thenReturn()是有副作用的。
如果有時(shí)候報(bào)錯(cuò)missing thenReturn等問題,可以把(對(duì)象.方法)
改為.(對(duì)象).方法
mockito怎么mock final修飾的類?
如果使用Mockito.mock(Gson.class)
,會(huì)報(bào)錯(cuò):
Mockito cannot mock/spy because : - final class
這是因?yàn)榈桶姹镜膍ockito是不能mock final類的。
解決方案:Mockito不能mock final類的解決辦法_南瓜慢說的博客-CSDN博客
改變mockito的版本,修改maven依賴如下:
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-inline</artifactId>
<version>3.3.3</version>
</dependency>
重跑測(cè)試,問題解決!
然而,萬一隨意變動(dòng)依賴導(dǎo)致其他test失效就得不償失了,因此最好從業(yè)務(wù)邏輯上對(duì)代碼進(jìn)行改造,這里我們涉及的代碼為:
Gson gson = new Gson();
String file = (String) gson.fromJson(result, Map.class).get("data");
Gson是final修飾的類,我們要調(diào)用它的fromJson方法,其實(shí)我們可以構(gòu)造一個(gè)json格式的字符串result:文章來源:http://www.zghlxwxcb.cn/news/detail-647858.html
{data:logs}
然后fromJson就能正常調(diào)用了。文章來源地址http://www.zghlxwxcb.cn/news/detail-647858.html
到了這里,關(guān)于Java單元測(cè)試之Mockito的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!