标签:junit verify powermockito mock
距离上次做junit单体测试几个月,果然又用到了,又学习了一些新的东西,总结一下。
首先是对spy的理解,以前一直用mock,没有用过spy,所以对spy并不了解,最近用过几次后,也在google上学习了一下,网上说的都比较书面,mock:全部mock;spy:部分mock;但是到底什么叫全部,什么叫部分却始终没有能弄明白,自己实际使用后感觉,全部mock应该是对整个方法进行mock,不实际走方法,直接返回mock的返回值;而spy的部分mock应该是虽然mock了这个方法,并且返回了我们设置的mock值,但是实际上还是走被mock的方法的,如果这个方法里有错,一样会报异常,影响当前方法的测试。纯个人理解!!!有误导不负责!!!!!
verify的使用,以前也没有用过这个东西,一般断言就够了,这次需要使用,了解了下他的作用,我知道的主要四个作用:①检证是否调用成功方法;②检证方法被调用的次数;③参数是否正确④检证超时。
在使用spy时y要注意一点;在进行mock时,开头不要使用when,而要用doReturn();
e.g:PowerMockito.doReturn("1234").when(instance,"method",args);√
e.g:PowerMockito.when(instance,"method",args).thenReturn("");×
mock私有方法(public方法下调用private方法情况)(全部mock)
①以前的方法,使用Whitebox.invoke();
②PowerMockito.doCallRealMethod().when(instance).method();
PowerMockito.DoReturn().when(instance,"method",args);
mock私有方法(public方法下调用private方法情况)(部分mock)
e.g:
public class A(){
public String b(int id){
return c();
}
private String c(){
return "abc"
}}
test:
A a = new A();
A aSpy = PowerMockito.spy(a);
PowerMockito.doReturn("ccc").when(aSpy,"c",1);
String retValue = aSpy.b(1);
PowerMockito.VerifyPrivate(aSpy).invoke("c");
mock静态方法
①@RunWith(PowerMockRunner.class)
@PrepareForTest({staticClass.class})
.......
PowerMockito.Mock(staticClass.class);
PowerMockito.when(staticClass.method(args)).thenReturn("123") //造参数 Mockito.any()
检证静态方法verify
PowerMocito.verifyStatic(MOckito.times(1));
staticClass.method(args1,args2);
Mock final类下的静态方法,操作和5是一样的。
Suppress方法,略过测试的某行
e.g:PowerMockito.suppress(PowerMockito.method(staticClass.class,"方法名",args1,...));
在不会以上两种mock私有方法的时候,大家一般用反射来实现,对私有方法的调用
Method method = className.class.getDeclaredMethod("private method name");
method.setAccessible(true) //设置可访问
目前总结这些,遇到新问题,有新的收货后会继续增加。
最后推荐一个网站,我在这上边学了很多:http://javatechnology.net/java/mockito-spy/
本文出自 “骑猴上树” 博客,请务必保留此出处http://qihoushangshu.blog.51cto.com/7872138/1694216
标签:junit verify powermockito mock
原文地址:http://qihoushangshu.blog.51cto.com/7872138/1694216