為什么單元測試要用Mock俯萎?
首先添加maven依賴
然后為了使代碼更簡潔,最好在測試類中導入靜態(tài)資源
1.簡單的mock操作:
【創(chuàng)建mock對象不能對final培漏,Anonymous(匿名) 常侦,primitive類(原始)進行mock】
【可以用PowerMockito的 @PrepareForTest()注入final類等】
@RunWith(PowerMockRunner.class)語句告訴JUnit用PowerMockRunner來執(zhí)行測試星爪。
@PrepareForTest(XX.class)語句告訴PowerMock準備XX類進行測試。適用于模擬final類或有final, private, static, native方法的類。
@Test
public void test(){
List list = Mockito.mock(List.class);
Mockito.when(list.get(0)).thenReturn("helloworld");
String result = list.get(0);
Mockito.verify(list).get(0);// 驗證list.get(0)是否執(zhí)行了
Assert.assertEquals("helloworld",result);//(預期值惫谤,得到的值)
}
2.異常
@Rule
public ExpectedException thrown= ExpectedException.none();
@Test
public void test(){
Object obj = new Object();//參數設置
thrown.expect(xxooException.class);//預期將拋出的異常
xxService.someMethod(obj);//執(zhí)行方法壁顶,若拋出預期的異常則test成功通過
}
3.怎么mock一個abstract抽象類
可以先創(chuàng)建一個子類繼承這個abstract類,override該抽象類的abstract方法溜歪,不用override其它方法
@InjectMocks
@Spy
private AbstractService verifyService = new MockService();
private class MockService extends AbstractService{
@Override
public String someMethod() {return null;}
}
4.Mock對象只能調用stubbed方法博助,調用不了它真實的方法。
但Mockito可以監(jiān)視(@Spy)一個真實的對象痹愚,這時對它進行方法調用時它將調用真實的方法富岳,同時也可以stubbing這個對象的方法讓它返回我們的期望值。另外不論是否是真實的方法調用都可以進行verify驗證拯腮。
but和創(chuàng)建mock對象一樣窖式,對于final類、匿名類和Java的基本類型是無法進行spy的动壤。
監(jiān)視對象
監(jiān)視一個對象需要調用spy(T object)方法萝喘,如:List spy = spy(new LinkedList());那么spy變量就在監(jiān)視LinkedList實例。
被監(jiān)視對象的Stubbing
stubbing被監(jiān)視對象的方法時要慎用when(Object)琼懊,如:
List?spy?=?spy(newLinkedList());
when(spy.get(0)).thenReturn("foo");
doReturn("foo").when(spy).get(0);
當調用when(spy.get(0)).thenReturn("foo")時阁簸,會調用真實對象的get(0),由于list是空的所以會拋出IndexOutOfBoundsException異常哼丈,用doReturn可以避免這種情況的發(fā)生启妹,因為它不會去調用get(0)方法。