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

簡介

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

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

其實(shí)從一個測試人員的角度看,靜態(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)類有依賴的類,那么如果此依賴類可以通過接口進(jìn)行抽象,則可以使用setter諸如,例如:

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

如果要進(jìn)行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擴(kuò)展,它利用了EasyMock和Mockito模擬靜態(tài)method的方法對Java中的靜態(tài)method進(jìn)行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 ) //準(zhǔn)備被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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容