怎樣使用PowerMockito 測試靜態(tài)方法
PowerMockito 測試靜態(tài)方法
假如有下面一個類DemoStatic,它里面定義了各種靜態(tài)方法,這些靜態(tài)方法可能是一些Utilities方法,輔助其它的類。
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, 如下:
@RunWith(PowerMockRunner.class)
@PrepareForTest({DemoStatic.class})
public class DemoStaticTest {
}
注意在類的前面要加這個annotation:
@PrepareForTest({DemoStatic.class})
其次
需要在你的項目中加入下面的maven依賴:
<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 無參數(shù)的靜態(tài)方法
@Test
public void testMockSayHello() {
PowerMockito.spy(DemoStatic.class);
PowerMockito.when(DemoStatic.sayHello()).thenReturn("my hello");
System.out.println(DemoStatic.sayHello()); // my hello
}
Mock 帶參數(shù)的靜態(tài)方法
@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 靜態(tài)方法
@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 靜態(tài)方法模擬問題排查,結(jié)果是函數(shù)參數(shù)問題
問題:靜態(tài)方法User.convert()的模擬,未匹配到預期值。

1. 檢查靜態(tài)方法的模擬過程
Mocking Static Method: // 1.類注解:@PrepareForTest(Static.class) //Static.class 是包含 static methods的類 方法內(nèi): // 2.模擬靜態(tài)類(使用PowerMockito.spy(class)模擬特定方法) PowerMockito.mockStatic(Static.class); // 3.攔截:設置期望值 Mockito.when(Static.firstStaticMethod(param)).thenReturn(value);
檢查過程沒問題。 直接攔截靜態(tài)方法試試
2. 直接攔截靜態(tài)方法

驗證通過,模擬靜態(tài)方法沒問題。
3. 初步定義為參數(shù)問題:函數(shù)式參數(shù)
// 攔截的方法 <E, R> List<R> queryForList(Object var1, Class<E> var2, Function<E, R> var3);
Function類型的參數(shù)精確配置不應該 User::convert 這樣傳。那該怎么傳呢?我在官網(wǎng)和百度扒資料,然而不知道是沒有,還是沒找對。反正,沒找到該怎么解決。
沒辦法,只好先模糊匹配下了
4. 只匹配類型,算解決問題嗎

花了時間不一定有收獲,不花時間也許也有收獲呢。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
springboot如何使用logback-spring配置日志格式,并分環(huán)境配置
這篇文章主要介紹了springboot如何使用logback-spring配置日志格式,并分環(huán)境配置的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07
Spring注解@Profile實現(xiàn)開發(fā)環(huán)境/測試環(huán)境/生產(chǎn)環(huán)境的切換
在進行軟件開發(fā)過程中,一般會將項目分為開發(fā)環(huán)境,測試環(huán)境,生產(chǎn)環(huán)境。本文主要介紹了Spring如何通過注解@Profile實現(xiàn)開發(fā)環(huán)境、測試環(huán)境、生產(chǎn)環(huán)境的切換,需要的可以參考一下2023-04-04
Java生產(chǎn)1-100的隨機數(shù)簡單實例(分享)
下面小編就為大家?guī)硪黄狫ava生產(chǎn)1-100的隨機數(shù)簡單實例(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05
SpringBoot部署到外部Tomcat無法注冊到Nacos服務端的解決思路
這篇文章主要介紹了SpringBoot部署到外部Tomcat無法注冊到Nacos服務端,本文給大家分享完美解決思路,結(jié)合實例代碼給大家講解的非常詳細,需要的朋友可以參考下2023-03-03
SpringBoot實現(xiàn)License認證(只校驗有效期)的詳細過程
License也就是版權(quán)許可證書,一般用于收費軟件給付費用戶提供的訪問許可證明,這篇文章主要介紹了SpringBoot實現(xiàn)License認證(只校驗有效期),需要的朋友可以參考下2024-04-04

