怎樣使用PowerMockito 測(cè)試靜態(tài)方法
PowerMockito 測(cè)試靜態(tài)方法
假如有下面一個(gè)類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"; } }
首先
我們寫一個(gè)測(cè)試類DemoStaticTest.java, 如下:
@RunWith(PowerMockRunner.class) @PrepareForTest({DemoStatic.class}) public class DemoStaticTest { }
注意在類的前面要加這個(gè)annotation:
@PrepareForTest({DemoStatic.class})
其次
需要在你的項(xiàng)目中加入下面的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()的模擬,未匹配到預(yù)期值。
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.攔截:設(shè)置期望值 Mockito.when(Static.firstStaticMethod(param)).thenReturn(value);
檢查過程沒問題。 直接攔截靜態(tài)方法試試
2. 直接攔截靜態(tài)方法
驗(yàn)證通過,模擬靜態(tài)方法沒問題。
3. 初步定義為參數(shù)問題:函數(shù)式參數(shù)
// 攔截的方法 <E, R> List<R> queryForList(Object var1, Class<E> var2, Function<E, R> var3);
Function類型的參數(shù)精確配置不應(yīng)該 User::convert 這樣傳。那該怎么傳呢?我在官網(wǎng)和百度扒資料,然而不知道是沒有,還是沒找對(duì)。反正,沒找到該怎么解決。
沒辦法,只好先模糊匹配下了
4. 只匹配類型,算解決問題嗎
花了時(shí)間不一定有收獲,不花時(shí)間也許也有收獲呢。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
java正則表達(dá)式匹配網(wǎng)頁所有網(wǎng)址和鏈接文字的示例
這篇文章主要介紹了java正則表達(dá)式匹配網(wǎng)頁所有網(wǎng)址和鏈接文字java正則表達(dá)式匹配,需要的朋友可以參考下2014-03-03Java中比較器Comparator和Comparable的區(qū)別
這篇文章主要介紹了Java中比較器Comparator和Comparable的區(qū)別,我們?cè)谑褂?Collections.sort()對(duì)鏈表進(jìn)行排序時(shí),常常需要根據(jù)不同情況自定義排序規(guī)則,今天我們來看看比較器之間的區(qū)別,需要的朋友可以參考下2023-08-08SpringMVC的REST風(fēng)格的四種請(qǐng)求方式總結(jié)
下面小編就為大家?guī)硪黄猄pringMVC的REST風(fēng)格的四種請(qǐng)求方式總結(jié)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-08-08SpringBoot使用GraphQL開發(fā)Web API實(shí)現(xiàn)方案示例講解
這篇文章主要介紹了SpringBoot使用GraphQL開發(fā)Web API實(shí)現(xiàn)方案,GraphQL是一個(gè)從服務(wù)端檢數(shù)據(jù)的查詢語言。某種程度上,是REST、SOAP、或者gRPC的替代品2023-04-04Mybatis Mapper接口和xml綁定的多種方式、內(nèi)部實(shí)現(xiàn)原理和過程解析
在Mybatis中,我們需要?jiǎng)?chuàng)建一個(gè)與實(shí)體類對(duì)應(yīng)的Mapper接口,然后在該接口上添加方法,這些方法對(duì)應(yīng)著SQL語句,這篇文章主要介紹了Mybatis Mapper接口和xml綁定的多種方式、內(nèi)部實(shí)現(xiàn)原理和過程,需要的朋友可以參考下2023-11-11idea 安裝 Mybatis 開發(fā)幫助插件 MyBatisCodeHelper-Pro 插件破解版的方法
MyBatisCodeHelper-Pro 插件可以幫助我們快速的開發(fā) mybatis,這篇文章給大家介紹idea 安裝 Mybatis 開發(fā)幫助插件 MyBatisCodeHelper-Pro 插件破解版的相關(guān)知識(shí),感興趣的朋友跟隨小編一起看看吧2020-09-09