JUnit+Mockito單元測試之打樁when().thenReturn();
什麼是Mock 測試
Mock 測試就是在測試過程中,對於某些不容易構造
(如 HttpServletRequest 必須在Servlet 容器中才能構造出來)或者不容易獲取
的物件(如 JDBC 中的ResultSet 物件,JPA的CRUDRepository,需要執行資料庫操作的),用一個虛擬的物件(Mock 物件)來建立(覆蓋方法返回)以便測試的測試方法。
JUnit
是一個單元測試框架。Mockito
是用於資料模擬物件的框架。
when().thenReturn();
when( mockRepository.getMock("x") ).thenReturn( "1024" );
String mock= mockRepository.getMock("x");
assertEquals( "預期x=1024","1024", mock);
when(xxxx).thenReturn(yyyy); 是指定當執行了這個方法的時候,返回 thenReturn 的值,相當於是對模擬物件的配置過程,為某些條件給定一個預期的返回值。
HttpServletRequest request = mock(HttpServletRequest.class);
when(request.getParameter("csdn")).thenReturn("zhengkai");
assertEquals( "預期csdn=zhengkai",request.getParameter("csdn"), "zhengkai");
Stub 打樁
Mockito 中 when().thenReturn();
這種語法來定義物件方法和引數(輸入),然後在 thenReturn 中指定結果(輸出)。此過程稱為 Stub 打樁
。一旦這個方法被 stub 了,就會一直返回這個 stub 的值。
!!!
Stub 打樁 需要注意的是:
- 對於 static 和 final 方法, Mockito 無法對其 when(…).thenReturn(…) 操作。
- 當我們連續兩次為同一個方法使用 stub 的時候,他只會只用最新的一次。
迭代打樁
打樁支援迭代風格的返回值,第一次呼叫 i.next() 將返回 ”Hello”,第二次的呼叫會返回 ”World”。
// 第一種方式 ,都是等價的
when(i.next()).thenReturn("Hello").thenReturn("World");
// 第二種方式,都是等價的
when(i.next()).thenReturn("Hello", "World");
// 第三種方式,都是等價的
when(i.next()).thenReturn("Hello"); when(i.next()).thenReturn("World");
void如何打樁
沒有返回值的 void 方法呢?不需要執行,只需要模擬跳過,寫法上會有所不同,沒返回值了呼叫 thenReturn(xxx) 肯定不行,取而代之的用 doNothing().when().notify();
doNothing().when(obj).notify();
// 或直接
when(obj).notify();
丟擲異常
when(i.next()).thenThrow(new RuntimeException());
doThrow(new RuntimeException()).when(i).remove(); // void 方法的
// 迭代風格
doNothing().doThrow(new RuntimeException()).when(i).remove();
// 第一次呼叫 remove 方法什麼都不做,第二次呼叫丟擲 RuntimeException 異常。
Any()
anyString()
匹配任何 String 引數,anyInt()
匹配任何 int 引數,anySet()
匹配任何 Set,any()
則意味著引數為任意值 any(User.class)
匹配任何 User類。
when(mockedList.get(anyInt())).thenReturn("element");
System.out.println(mockedList.get(999));// 此時列印是 element
System.out.println(mockedList.get(777));// 此時列印是 element
相關文章
- 偽物件、樁物件、模擬物件|單元測試物件
- 測試 之Java單元測試、Android單元測試JavaAndroid
- Go 單元測試之mock介面測試GoMock
- Java單元測試之junitJava
- 單元測試:單元測試中的mockMock
- Java單元測試神器之MockitoJavaMockito
- Java單元測試技巧之PowerMockJavaMock
- 測試開發之單元測試-禪道結合ZTF驅動單元測試執行
- Go 單元測試之HTTP請求與API測試GoHTTPAPI
- Go 單元測試之Mysql資料庫整合測試GoMySql資料庫
- 開發必備之單元測試
- Python 的單元測試之 unittestPython
- [iOS單元測試系列]單元測試編碼規範iOS
- Flutter 單元測試Flutter
- Go單元測試Go
- 單元測試工具
- iOS 單元測試iOS
- 前端單元測試前端
- golang 單元測試Golang
- PHP 單元測試PHP
- phpunit單元測試PHP
- JUnit單元測試
- unittest單元測試
- Junit 單元測試.
- 單元測試真
- Java單元測試之JUnit 5快速上手Java
- 前端單元測試之Karma環境搭建前端
- ASP.NET 系列:單元測試之SmtpClientASP.NETclient
- ASP.NET 系列:單元測試之StructureMapASP.NETStructREM
- 單元測試之模擬物件技術物件
- 前端測試:Part II (單元測試)前端
- Spring Boot單元測試之服務層測試總結Spring Boot
- 專案必備技術之單元測試
- JBuilder 2005單元測試之慨述UI
- JavaScript單元測試框架JavaScript框架
- React元件單元測試React元件
- 聊聊前端單元測試前端
- Google 單元測試框架Go框架