powerMock是基于easyMock或Mockito扩展出来的增强版本,所以powerMock分两种类型,如果你习惯于使用easyMock的,那你就下载基于easyMock的powerMock,反之你喜欢用mockito的话就下载另一种PowerMock.
powerMock之所以说它更强大是因为它解决了easyMock和Mockito没有解决的问题,就是可以模仿static,private和final的方法。举例如下:
public class User{
private User user=new User();
public User(){
System.out.println("new User()");
}
public static User getInstance(){
return user;
}
private String getHello(String h)
{
return "hello "+h;
}
public String sayHello(String h)
{
return getHello(h);
}
}
public classSubUser extends User{
public SubUser(){
System.out.println("new SubUser()");
}
}
测试用例,注意以下例子需要用junit4才能运行,如是不行的话建议重下一个jar包:junit-4.0.jar
@RunWith(PowerMockRunner.class)//powerMock包里有两个PowerMockRunner,所以如果你的不能运行,请更换另一个试试
@PrepareForTest(User.class)
public class TestUser extends TestCase {
User user;
//测试静态方法
@Test
public void testVerify()
{
mockStatic(User.class);
when(User.getInstance()).thenReturn(new SubUser());
User user=User.getInstance();
verifyStatic();
}
//测试new一个对象
@Test
public void testWhenNew() {
try {
mockStatic(User.class);
whenNew(User.class).withNoArguments().thenReturn(new SubUser()) ;
user=new User();
verifyNew(User.class).withNoArguments();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
@Test//测试私有方法
public void testPrivate() {
User u = PowerMockito.spy(new User());
try {
PowerMockito.doReturn("hello world").when(u, "getHello", "hello");
System.out.println(u.sayHello("hello"));
PowerMockito.verifyPrivate(u, times(1)).invoke("getHello", "hello");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
输出---------------------------------
new SubUser()
new SubUser()
hello world
其它用法请参考这里:http://code.google.com/p/powermock/wiki/MockitoUsage13
以上为个人的一点经验,有可能表述有误,敬请指正