日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用PowerMock模拟静态方法

發布時間:2023/12/3 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用PowerMock模拟静态方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在最近的博客中,我試圖強調使用依賴注入的好處,并表達一種想法,即這種技術的主要好處之一是,通過在類之間提供高度的隔離,它可以使您更輕松地測試代碼,并且得出的結論是,許多好的測試等于好的代碼。

但是,當您沒有依賴項注入并且使用的第三方庫包含某個包含靜態方法的特定年份的類時,會發生什么? 一種方法是通過在它們周圍編寫包裝器或適配器并在測試過程中提供隔離來隔離這些類。 但是,還有另一種方法:使用PowerMock。 PowerMock是一個模擬框架,可擴展其他模擬框架以提供急需的其他功能。 模仿舊廣告:“它刷新了其他模擬框架無法達到的部分”。

該博客介紹了PowerMock模擬靜態方法的能力,并提供了一個模擬JDK的ResourceBundle類的示例,眾所周知,該類使用ResourceBundle.getBundle(...)來…加載資源束。

與許多其他博客作者和作家一樣,我通常會提出一些高度人為的方案來突出問題。 今天有所不同,我只得到了一個使用ResourceBundle的類,稱為:UsesResourceBundle:

public class UsesResourceBundle {private static Logger logger = LoggerFactory.getLogger(UsesResourceBundle.class);private ResourceBundle bundle;public String getResourceString(String key) {if (isNull(bundle)) {// Lazy load of the resource bundleLocale locale = getLocale();if (isNotNull(locale)) {this.bundle = ResourceBundle.getBundle("SomeBundleName", locale);} else {handleError();}}return bundle.getString(key);}private boolean isNull(Object obj) {return obj == null;}private Locale getLocale() {return Locale.ENGLISH;}private boolean isNotNull(Object obj) {return obj != null;}private void handleError() {String msg = "Failed to retrieve the locale for this page";logger.error(msg);throw new RuntimeException(msg);} }

您可以看到有一個方法:getResourceString(…),給定一個鍵將從包中檢索資源字符串。 為了使這項工作更有效率,我懶洋洋地加載了我的資源包,加載后,我調用bundle.getString(key)檢索我的資源。 為了測試這一點,我編寫了一個PowerMock JUnit測試:

import static org.easymock.EasyMock.expect; import static org.junit.Assert.assertEquals; import static org.powermock.api.easymock.PowerMock.mockStatic; import static org.powermock.api.easymock.PowerMock.replayAll; import static org.powermock.api.easymock.PowerMock.verifyAll;import java.util.Locale; import java.util.MissingResourceException; import java.util.ResourceBundle;import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.api.easymock.annotation.Mock; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner;@RunWith(PowerMockRunner.class) @PrepareForTest(UsesResourceBundle.class) public class UsesResourceBundleTest {@Mockprivate ResourceBundle bundle;private UsesResourceBundle instance;@Beforepublic void setUp() {instance = new UsesResourceBundle();}@Testpublic final void testGetResourceStringAndSucceed() {mockStatic(ResourceBundle.class);expect(ResourceBundle.getBundle("SomeBundleName", Locale.ENGLISH)).andReturn(bundle);final String key = "DUMMY";final String message = "This is a Message";expect(bundle.getString(key)).andReturn(message);replayAll();String result = instance.getResourceString(key);verifyAll();assertEquals(message, result);}@Test(expected = MissingResourceException.class)public final void testGetResourceStringWithStringMissing() {mockStatic(ResourceBundle.class);expect(ResourceBundle.getBundle("SomeBundleName", Locale.ENGLISH)).andReturn(bundle);final String key = "DUMMY";Exception e = new MissingResourceException(key, key, key);expect(bundle.getString(key)).andThrow(e);replayAll();instance.getResourceString(key);}@Test(expected = MissingResourceException.class)public final void testGetResourceStringWithBundleMissing() {mockStatic(ResourceBundle.class);final String key = "DUMMY";Exception e = new MissingResourceException(key, key, key);expect(ResourceBundle.getBundle("SomeBundleName", Locale.ENGLISH)).andThrow(e);replayAll();instance.getResourceString(key);}}

在上面的代碼中,我采取了不尋常的步驟,包括導入語句。 要強調的是,我們使用的是PowerMock的導入靜態版本,而不是EasyMock的靜態版本。 如果您不小心導入了EasyMock的靜態函數,那么整個過程將不起作用。

設置模擬靜態調用的測試有四個簡單的步驟:

1.使用PowerMock JUnit運行器:

@RunWith(PowerMockRunner.class)

2.聲明我們要嘲笑的測試類:

@PrepareForTest(UsesResourceBundle.class)

3.告訴PowerMock包含靜態方法的類的名稱:

mockStatic(ResourceBundle.class);

4.設置期望值,告訴PowerMock期望對靜態方法的調用:

expect(ResourceBundle.getBundle("SomeBundleName", Locale.ENGLISH)).andReturn(bundle);

其余的工作很順利,您可以為其他標準方法調用設置期望,并告訴PowerMock / EasyMock運行測試,并驗證結果:

final String key = "DUMMY"; final String message = "This is a Message"; expect(bundle.getString(key)).andReturn(message);replayAll(); String result = instance.getResourceString(key); verifyAll();

PowerMock可以做更多的事情,例如模擬構造函數和私有方法調用。 也許以后再說……

參考: 使用PowerMock來模擬我們JCG合作伙伴的 靜態方法 調試隊長博客上的 Roger。

相關文章 :
  • JUnit 4.9(測試版3)中的規則
  • 使用PowerMock測試對象的內部狀態
  • Servlet 3.0異步處理可將服務器吞吐量提高十倍
  • 用Scala測試
  • Java工具:源代碼優化和分析
  • Java教程和Android教程列表

翻譯自: https://www.javacodegeeks.com/2011/11/mock-static-methods-with-powermock.html

總結

以上是生活随笔為你收集整理的使用PowerMock模拟静态方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产一级在线观看 | 国产一区二区在线免费 | 天天爽夜夜爽一区二区三区 | 欧美极品一区二区三区 | 美女久久久久 | 男男在线观看 | 污视频免费在线观看网站 | 久久久久久久国产精品美女 | 欧美一二级| 亚洲国产高清国产精品 | 精品一区二区三区免费 | 成年人午夜免费视频 | 美日韩精品一区二区 | 国产aaaaaa| 亚洲福利电影 | 澳门黄色| 日韩激情成人 | 中文字幕精品久久久久人妻红杏1 | 人妻与黑人一区二区三区 | 国产高清免费av | 久久黄色一级视频 | 嫩草影院永久入口 | 欧美做受69| 国产网站黄色 | 另类尿喷潮videofree | 亚洲精品一区二区三区不卡 | 色就是色亚洲色图 | hitomi一区二区三区精品 | 国产日产欧美一区二区三区 | 操xxxx| 一区二区三区高清不卡 | 欧美做爰性生交视频 | 亚洲精品系列 | www.色天使 | 久久国产精品波多野结衣av | 五月天综合网站 | 国产xxxx在线观看 | 一集毛片 | 永久免费看片在线播放 | 久久99精品国产.久久久久 | 欧美日本二区 | 成年人黄色录像 | 国产黄色影院 | 亚洲麻豆一区 | av网站免费大全 | 午夜天堂在线 | 密桃成熟时在线观看 | 97人妻精品一区二区三区免 | 又色又爽又黄 | 色花av | 亲切的金子片段 | 亚洲另类色综合网站 | 草草影院在线 | 日本免费a级片 | 老司机综合网 | 少妇自拍视频 | 国产av无码专区亚洲av | 久久精品一区二 | 精品国产乱码一区二区三区99 | 182tv福利视频 | 欧美中文字幕在线 | 孕妇丨91丨九色 | 久久国产激情 | 夜夜久久 | 在办公室被c到呻吟的动态图 | 久久无码人妻精品一区二区三区 | 一区二区三区午夜 | 中文字幕美女 | 日韩福利| 国产一区二区激情 | 视频免费在线 | 99爱免费| 色欧美片视频在线观看 | 污污小说在线观看 | 91中出| 999免费 | 国产精成人品免费观看 | 欧美xxxxhd| www操| 一区影视| 亚洲色偷精品一区二区三区 | 亚洲性图第一页 | 九草在线 | 久久精品无码一区二区三区 | 久久老熟女一区二区三区 | 青青国产在线观看 | 欧美日韩国产成人精品 | 亚洲综合五月 | 国产三级久久 | 久久99精品久久久 | 国产精品久久久久久久免费 | 欧美成人一区二区在线 | 欧美嫩草影院 | 久久久久久久黄色 | 激情啪啪网站 | 国产福利视频在线 | 免费福利影院 | 免费一级黄 | 九九视频在线观看 |