簡介
一般來說揖铜,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>