3.1 doReturn()方法
現在魔法來了……
假設您創建了一個偽造的模擬對象,但您需要它以某種方式工作。當調用某些方法時,完成了一些重要的事情,或者這些方法返回了某個結果。該怎麼辦?
Mockito 庫允許您將所需的行為添加到模擬對象。
如果你想讓模擬對像在調用某個方法時返回某個結果,那麼可以使用代碼將這個“規則”添加到對像中:
Mockito.doReturn(result).when(an object).method name();
你看,在方法調用結束時,method name?
這裡實際上沒有進行任何調用。該方法doReturn()
返回一個特殊的代理對象,借助它監視對象方法的調用,從而編寫規則。
再次。編寫添加到模擬對象的規則真是一種聰明的方法。當你看到這樣的代碼時,需要一些技巧才能在你的腦海中正確地解釋它。自帶經驗。
我認為需要一個具體的例子。讓我們創建一個模擬類對象ArrayList
並要求其方法size()
返回數字 10。完整的代碼如下所示:
@ExtendWith(MockitoExtension.class)
class DoReturnTest {
@Mock
List mockList;
@Test
public void whenMockAnnotation () {
//create a rule: return 10 when calling the size method
Mockito.doReturn(10).when(mockList).size();
//the method is called here and will return 10!!
assertEquals(10, mockList.size());
}
}
是的,這段代碼可以工作,測試不會失敗。
3.2 when()方法
還有另一種向模擬對象添加行為規則的方法——通過調用Mockito.when()
. 它看起來像這樣:
Mockito.when(an object.method name()).thenReturn(result);
這與上一個編寫模擬對象行為規則的方式相同。比較:
Mockito.doReturn(result).when(an object).method name();
這裡發生了完全相同的事情——新規則的構建。
沒錯,第一個例子有兩個缺點:
- 這個電話很混亂。
an object.method name()
methodname()
如果該方法返回 ,將不起作用void
。
好吧,讓我們寫下我們最喜歡的例子Mockito.when()
@ExtendWith(MockitoExtension.class)
class WhenTest {
@Mock
List mockList;
@Test
public void whenMockAnnotation() {
//create a rule: return 10 when calling the size method
Mockito.when(mockList.size() ).thenReturn(10);
//the method is called here and will return 10!!
assertEquals(10, mockList.size());
}
}
3.3 doThrow()方法
我們弄清楚瞭如何使模擬對象方法返回特定結果。我怎樣才能讓它拋出一個特定的異常?寄給doReturn()
?
為了防止方法返回,即拋出異常,您需要使用doThrow()
.
Mockito.doThrow(exception.class).when(an object).method name();
然後是第二個選項:
Mockito.when(an object.method name()).thenThrow(exception.class);
有點期待吧?
嗯,你看,你已經開始明白了。讓我們用一個例子來修復它:
@ExtendWith(MockitoExtension.class)
class DoThrowTest {
@Mock
List mockList;
@Test
public void whenMockAnnotation() {
Mockito.when(mockList.size() ).thenThrow(IllegalStateException.class);
mockList.size(); //an exception will be thrown here
}
}
如果你需要拋出一個特定的異常對象,那麼使用這種形式的構造:
Mockito.doThrow(new Exception()).when(an object).method name();
只需將doThrow()
異常對像傳遞給方法,它就會在方法調用期間拋出。