Spring單元測試總結

之前自己跟着網上做項目的時候,因爲是從下到上都是自己開發的,測試也是從下到上一層層的集成測試,一直沒有理解單元測試的精華,實習以後接手的都是一些基於其他項目的小需求,如果會用單元測試就會輕量很多,方便很多,這裏主要總結了單元測試常用的東西,以後如果用深入了或許還會添加一些。單元測試最主要的是創建mock對象,打樁,調用方法,驗證交互,斷言結果

 

Mock的使用

一般來說,Mockito都和Junit是配合使用的,在pom.xml中要引入這兩個依賴

  • 創建mock對象

    • 在spring中,測試類添加@RunWith(MockitoJunitClassRunner.class),然後對要mock的對象添加@mock註釋
    • 使用Class mockObj = Mockito.mock(Class.class);
  • @Test:在測試方法上添加@Test註釋

    @Test(excepted=xx.class): xx.class表示異常類,表示測試的方法拋出此異常時,認爲是正常的測試通過的;@Test(timeout=毫秒數) :測試方法執行時間是否符合預期

  • stub 打樁

    • when(mockObj.method())thenReturn()
    • doReturn()when(mockObj).method()
    • 返回值爲void時,可用doNothing()when().method()
  • @Spy或Mockito.spy():

    被@Spy或Mockito.spy() 封裝的對象,只要沒有被打樁stub的方法,都會真實的調用對象的方法

  • 驗證交互(varify)

    • 驗證方法

      verify(mockObj,times(5)).method():驗證方法被調用5次,time()還可以被換成:

      • never()
      • atLeastOnce()
      • atLeast(4)
      • atMost(6)
  • 斷言結果(assert) 斷言屬於Junit包下的方法

    • 判斷相同(equal):assertEqueals(msg,exceptValue,mockObj.method())
    • 判斷真/假:assertTure(msg,condition)/assertFalse(msg,condition)
    • 判斷空/非空:assertNull(msg,obj)/assertNotNull(msg,obj)
    • 判斷相等/不等(==): assertSame(msg,except,actual)/assertNotSame(msg,except,actual)

    源碼參考:https://www.cnblogs.com/qlqwjy/p/7246029.html

  • 參數匹配器

    • 模擬參數:anyInt()/anyByte/anyObject()/anyLong()/anyList()
    • 判斷參數:
      • isA()(判斷是否是某個類的實例)
      • isNull() 判斷某個參數是否爲空
      • same()
      • eq()
    • startsWith()
  • @Before方法

    在每個@Test方法執行前都會執行的方法,可以用來對公用的依賴對象進行mock和打樁

細節問題

  • when()thenReturn和doReturn()when().method()的區別:

    當對象被@Spy或者Mockito.spy()封裝的時候,使用when()thenReturn()打樁會失敗,因爲會真實的調用對象的方法,而不是返回打樁的結果,但是可以使用doReturn()when().method()來打樁,這時可以打樁成功。 參考 https://blog.csdn.net/u010781856/article/details/78110783

  • Mockito參考https://www.jianshu.com/p/f6e3ab9719b9

  • Mockito限制:

    • final類不能被mock
    • 匿名類不能被mock
    • 原始類型不能被mock
    • Mockito不能mock靜態方法,這時可以用Powermock

以上的限制是因爲easyMock和Mockito是基於動態代理實現的,而Powermock是基於CGLib實現的

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