距離上次做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) //設置可訪問
在測試中出現的一個對象連續多次調用的情況如何mock
e.g:有一個對象a,在類的入口處聲明A a;使用註解或者spring配置之類的,下邊有個b方法
public void b(){
a.getName().getId();
}
上邊這種情況在mock的時候mock兩次,分別mock
PowerMockito.when(a.getName()).thenReturn(name);
PowerMockito.when(a.getName().getId()).thenReturn(id);
返回值name和id如果是自己直接new出來的,一般會出現類型錯誤,然後使用mock來創建就會解決這個問題了。
目前總結這些,遇到新問題,有新的收穫後會繼續增加。
最後推薦一個網站,我在這上邊學了很多:http://javatechnology.net/java/mockito-spy/