PowerMockito 測試靜態方法
假如有下面一個類DemoStatic,它里面定義了各種靜態方法,這些靜態方法可能是一些Utilities方法,輔助其它的類。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
package mock.demo; public class DemoStatic { public static String sayHello() { return "Hello" ; } public static String saySomething(String word) { return word; } public static void sayAgain() { System.out.println(getMyWord()); } private static String getMyWord() { return "This is my word" ; } } |
首先
我們寫一個測試類DemoStaticTest.java, 如下:
1
2
3
4
|
@RunWith (PowerMockRunner. class ) @PrepareForTest ({DemoStatic. class }) public class DemoStaticTest { } |
注意在類的前面要加這個annotation:
1
|
@PrepareForTest ({DemoStatic. class }) |
其次
需要在你的項目中加入下面的maven依賴:
1
2
3
4
5
6
7
8
9
10
|
< dependency > < groupId >org.powermock</ groupId > < artifactId >powermock-api-mockito</ artifactId > < version >1.4.10</ version > </ dependency > < dependency > < groupId >org.powermock</ groupId > < artifactId >powermock-module-junit4</ artifactId > < version >1.4.10</ version > </ dependency > |
Mock 無參數的靜態方法
1
2
3
4
5
6
7
|
@Test public void testMockSayHello() { PowerMockito.spy(DemoStatic. class ); PowerMockito.when(DemoStatic.sayHello()).thenReturn( "my hello" ); System.out.println(DemoStatic.sayHello()); // my hello } |
Mock 帶參數的靜態方法
1
2
3
4
5
6
7
|
@Test public void testSaySomething() throws Exception { PowerMockito.spy(DemoStatic. class ); PowerMockito.when(DemoStatic. class , "saySomething" , Mockito.anyString()).thenReturn( "something to say!" ); System.out.println(DemoStatic.saySomething( "say hello" )); //something to say! } |
Mock private 靜態方法
1
2
3
4
5
6
7
|
@Test public void testMockPrivate() throws Exception { PowerMockito.spy(DemoStatic. class ); PowerMockito.when(DemoStatic. class , "getMyWord" ).thenReturn( "Nothing to say" ); DemoStatic.sayAgain(); //Nothing to say } |
PowerMock 靜態方法模擬問題排查,結果是函數參數問題
問題:靜態方法User.convert()的模擬,未匹配到預期值。
1. 檢查靜態方法的模擬過程
1
2
3
4
5
6
7
|
Mocking Static Method: // 1.類注解:@PrepareForTest(Static.class) //Static.class 是包含 static methods的類 方法內: // 2.模擬靜態類(使用PowerMockito.spy(class)模擬特定方法) PowerMockito.mockStatic(Static. class ); // 3.攔截:設置期望值 Mockito.when(Static.firstStaticMethod(param)).thenReturn(value); |
檢查過程沒問題。 直接攔截靜態方法試試
2. 直接攔截靜態方法
驗證通過,模擬靜態方法沒問題。
3. 初步定義為參數問題:函數式參數
1
2
|
// 攔截的方法 <E, R> List<R> queryForList(Object var1, Class<E> var2, Function<E, R> var3); |
Function類型的參數精確配置不應該 User::convert 這樣傳。那該怎么傳呢?我在官網和百度扒資料,然而不知道是沒有,還是沒找對。反正,沒找到該怎么解決。
沒辦法,只好先模糊匹配下了
4. 只匹配類型,算解決問題嗎
花了時間不一定有收獲,不花時間也許也有收獲呢。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/west_609/article/details/74906491