使用PowerMock框架進行靜態(tài)方法的測試

簡介

一般來說揖铜,Java中的靜態(tài)方法無法用傳統(tǒng)的Jmock進行單測张惹,這也就給研發(fā)人員和測試人員造成了一定的困擾旺坠。本文介紹一種使用PowerMock執(zhí)行靜態(tài)方法單元測試的手段堂淡,其實網(wǎng)上也有使用如Mockito的方法教馆,大家可以自行搜索逊谋。

靜態(tài)方法的測試手段

其實從一個測試人員的角度看,靜態(tài)方法的測試并不比非靜態(tài)方法難土铺,比如下面這個例子:

public final class StringUtil {
    public static String nullSafeTrim(String s) {
        return s == null ? "" : s.trim();
    }
}

寫StringUtil的單測case與一般的代碼類似胶滋,在代碼的before,代碼中悲敷,或after放你的單測case究恤。

public class StringUtilTest {
 
   @Test public void shouldHandleNull() {
      assertEquals("", StringUtil.nullSafeTrim(null));
   }
 
   @Test public void shouldHandleEmptyString() {
      assertEquals("", StringUtil.nullSafeTrim(""));
   }
 
   @Test public void shouldTrimWhiteSpace() {
      assertEquals("foo bar", StringUtil.nullSafeTrim("\t\n\r foo bar \r\n\t"));
   }
 
}

如果靜態(tài)類有依賴的類,那么如果此依賴類可以通過接口進行抽象后德,則可以使用setter諸如部宿,例如:

public interface Dependency {
   void doSomething();
}
 
public final class StringUtil {
 
   private static Dependency dependency;
 
   public static void setDependency(Dependency d) {
      dependency = d;
   }
   ...
}

如果要進行mock的話:

public class DependencyMock implements Dependency {
 
   public void doSomething() {
   }
}
 
public class StringUtilTest {
 
   @Before public void setUp() {
      StringUtil.setDependency( new DependencyMock() );
   }
   ...
}

利用PowerMock測試靜態(tài)方法

PowerMock是一個JUnit擴展,它利用了EasyMock和Mockito模擬靜態(tài)method的方法對Java中的靜態(tài)method進行Mock瓢湃,而且它還有更多的功能(詳見github/powermock)理张。

例如,現(xiàn)在有如下程序:

public class Calculator {
 
   public int add(int a, int b) {
      return MathUtil.addInteger(a, b);
   }
}
 
public abstract class MathUtil {
 
   public static final int addInteger(int a, int b) {
      return a + b;
   }
 
   private MathUtil() {}
}

如果我們想Mock MathUtil的話:

@RunWith(PowerMockRunner.class)
@PrepareForTest( MathUtil.class ) //準備被mock的類绵患,在這里為MathUtil.class
public class CalculatorTest {
 
   /** Unit under test. */
   private Calculator calc;
 
   @Before public void setUp() {
      calc = new Calculator();
      
      //調(diào)用PowerMockito.mockStatic()
      PowerMockito.mockStatic(MathUtil.class);
      //使用PowerMockito.when()定義mock動作
      PowerMockito.when(MathUtil.addInteger(1, 1)).thenReturn(0);
      PowerMockito.when(MathUtil.addInteger(2, 2)).thenReturn(1);
   }
 
   @Test public void shouldCalculateInAStrangeWay() {
      assertEquals(0, calc.add(1, 1) );
      assertEquals(1, calc.add(2, 2) );
   }
}
注意雾叭,還要把依賴加入pom.xml(假設(shè)用的是Maven)就可以執(zhí)行了。
<properties>
    <powermock.version>1.4.9</powermock.version>
</properties>
 
<dependencies>
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-module-junit4</artifactId>
        <version>${powermock.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-api-mockito</artifactId>
        <version>${powermock.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-core</artifactId>
        <version>1.8.5</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.8.2</version>
        <scope>test</scope>
    </dependency>
</dependencies>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末落蝙,一起剝皮案震驚了整個濱河市拷况,隨后出現(xiàn)的幾起案子作煌,更是在濱河造成了極大的恐慌,老刑警劉巖赚瘦,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件粟誓,死亡現(xiàn)場離奇詭異,居然都是意外死亡起意,警方通過查閱死者的電腦和手機鹰服,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來揽咕,“玉大人悲酷,你說我怎么就攤上這事∏咨疲” “怎么了设易?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蛹头。 經(jīng)常有香客問我顿肺,道長,這世上最難降的妖魔是什么渣蜗? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任屠尊,我火速辦了婚禮,結(jié)果婚禮上耕拷,老公的妹妹穿的比我還像新娘讼昆。我一直安慰自己,他們只是感情好骚烧,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布浸赫。 她就那樣靜靜地躺著,像睡著了一般赃绊。 火紅的嫁衣襯著肌膚如雪既峡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天凭戴,我揣著相機與錄音,去河邊找鬼炕矮。 笑死么夫,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的肤视。 我是一名探鬼主播档痪,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼邢滑!你這毒婦竟也來了腐螟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎乐纸,沒想到半個月后衬廷,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡汽绢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年吗跋,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宁昭。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡跌宛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出积仗,到底是詐尸還是另有隱情疆拘,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布寂曹,位于F島的核電站哎迄,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏稀颁。R本人自食惡果不足惜芬失,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望匾灶。 院中可真熱鬧棱烂,春花似錦、人聲如沸阶女。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽秃踩。三九已至衬鱼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間憔杨,已是汗流浹背鸟赫。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留消别,地道東北人抛蚤。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像寻狂,于是被迫代替她去往敵國和親岁经。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容