之前自己跟着網上做項目的時候,因爲是從下到上都是自己開發的,測試也是從下到上一層層的集成測試,一直沒有理解單元測試的精華,實習以後接手的都是一些基於其他項目的小需求,如果會用單元測試就會輕量很多,方便很多,這裏主要總結了單元測試常用的東西,以後如果用深入了或許還會添加一些。單元測試最主要的是創建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)
-
參數匹配器:
- 模擬參數: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實現的