junit單體測試(PowerMockito)二

距離上次做junit單體測試幾個月,果然又用到了,又學習了一些新的東西,總結一下。

  1. 首先是對spy的理解,以前一直用mock,沒有用過spy,所以對spy並不瞭解,最近用過幾次後,也在google上學習了一下,網上說的都比較書面,mock:全部mock;spy:部分mock;但是到底什麼叫全部,什麼叫部分卻始終沒有能弄明白,自己實際使用後感覺,全部mock應該是對整個方法進行mock,不實際走方法,直接返回mock的返回值;而spy的部分mock應該是雖然mock了這個方法,並且返回了我們設置的mock值,但是實際上還是走被mock的方法的,如果這個方法裏有錯,一樣會報異常,影響當前方法的測試。純個人理解!!!有誤導不負責!!!!!

  2. verify的使用,以前也沒有用過這個東西,一般斷言就夠了,這次需要使用,瞭解了下他的作用,我知道的主要四個作用:①檢證是否調用成功方法;②檢證方法被調用的次數;③參數是否正確④檢證超時。

  3. 在使用spy時y要注意一點;在進行mock時,開頭不要使用when,而要用doReturn();

    e.g:PowerMockito.doReturn("1234").when(instance,"method",args);√

    e.g:PowerMockito.when(instance,"method",args).thenReturn("");×

  4. mock私有方法(public方法下調用private方法情況)(全部mock)

    ①以前的方法,使用Whitebox.invoke();

    ②PowerMockito.doCallRealMethod().when(instance).method();

      PowerMockito.DoReturn().when(instance,"method",args);

  5. 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");

  6. mock靜態方法

    ①@RunWith(PowerMockRunner.class)

      @PrepareForTest({staticClass.class})

      .......

      PowerMockito.Mock(staticClass.class);

      PowerMockito.when(staticClass.method(args)).thenReturn("123")  //造參數 Mockito.any()

  7. 檢證靜態方法verify

    PowerMocito.verifyStatic(MOckito.times(1));

    staticClass.method(args1,args2);

  8. Mock final類下的靜態方法,操作和5是一樣的。

  9. Suppress方法,略過測試的某行

    e.g:PowerMockito.suppress(PowerMockito.method(staticClass.class,"方法名",args1,...));

  10. 在不會以上兩種mock私有方法的時候,大家一般用反射來實現,對私有方法的調用

    Method method = className.class.getDeclaredMethod("private method name");

    method.setAccessible(true) //設置可訪問

  11. 在測試中出現的一個對象連續多次調用的情況如何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來創建就會解決這個問題了。

  12. 目前總結這些,遇到新問題,有新的收穫後會繼續增加。

  13. 最後推薦一個網站,我在這上邊學了很多:http://javatechnology.net/java/mockito-spy/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章