Mocking static methods
Mocking final methods or classes
Mocking private methods
Mock construction of new objects
Partial Mocking
Replay and verify all
Mock Policies
Test listeners
More to come...
可见,Powermock专门用来应付一些奇怪的测试需求,例如mock private方法,mock 静态方法,mock final方法。
这些需求传统而言,都是不需要,不应该测试的。
下面我们就来举一个例子,看看其他工具不能解决的怪异问题,powermock是怎么实现的。
对象是在方法内部被实例化的
我们来看一个简单的类,然后考察如何完成对应的测试。
public class SayHi {
public String sayHi(String a, String b){
Adder adder = new Adder(); //实例化了一个adder,作用就是将两个字符串加在一起。
String result = "";
result = adder.add(a, b);
return result;
}
}
public class Adder {
public String add(String a, String b){
return a + " " + b;
}
}
如果我们要测试SayHi这个类,很简单:
public class SayHiTest extends TestCase {
@Test
public void testSayHi() {
SayHi sh = new SayHi();
assertTrue(sh.sayHi("abc", "def").equalsIgnoreCase("abc def"));
}
}
SayHi sh = new SayHi();
assertTrue(sh.sayHi("abc", "def").equalsIgnoreCase("failed"));//这里我们看到了希望的效果:异常处理中的语句result = "Failed";被执行了
}
}
在这里很high的去看一下代码覆盖率:100%~~yes!!
Powermock为什么能将不可能变为可能,我们不需要深究,大概的实现方法是:
PowerMock uses a custom classloader and bytecode manipulation to enable mocking of static methods, constructors, final classes and methods, private methods, removal of static initializers and more.