模擬對象

開放

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()異常對像傳遞給方法,它就會在方法調用期間拋出。

留言
  • 受歡迎
你必須登入才能留言
此頁面尚無留言