使用Powermock和Mockito测试静态方法
转自:http://heipark.iteye.com/blog/1666681
1. 加入依赖包(maven)
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>1.4.10</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>1.4.10</version>
<scope>test</scope>
</dependency>
2. example
class MyStringUtil {
public static String uppercase(String s) {
return s.toUpperCase();
}
}
@RunWith(PowerMockRunner.class) // 1
@PrepareForTest({ MyStringUtil.class }) // 2
public class HelloTest {
@Before
public void before() {
PowerMockito.mockStatic(MyStringUtil.class); // 3
}
@Test
public void test() throws IOException {
PowerMockito.when(MyStringUtil.uppercase("abc")).thenReturn("ABC"); // 4
assertEquals("ABC", MyStringUtil.uppercase("abc")); // 5
}
}
① 标注使用PowerRunner运行test(powermock会修改字节码)
② 设置mock类(支持多个类,逗号分隔),这个可以设置到class上,也可以设置到method上。这里面包含两种类型:
- 被mock的类(如上例MyStringUtil .class,如果mock类为系统类,如System.class,则不需要这里设置就可以使用)
- context类,如果是在XxxServer里面希望mockMyStringUtil类,则要设置XxxServer.class
③ 告诉powermock需要mock哪个类。(感觉这里配置和②有点重合)
④ 打桩,设置mock对象返回预期值。(测试mock方法还未执行)
⑤ 执行mock方法,返回预期值。