簡體   English   中英

Mocking 與 mocking 框架中的間諜活動

[英]Mocking vs. Spying in mocking frameworks

在 mocking 框架中,您可以模擬object 或監視它。 兩者之間有什么區別,我什么時候/應該使用其中一個?

例如,查看Mockito ,我看到類似的事情正在使用spiesmocks完成,但我不確定兩者之間的區別。

模擬 object 完全替換模擬的 class,返回記錄值或默認值。 您可以“憑空”創建模擬。 這是單元測試期間最常用的。

監視時,您使用現有的 object 並僅“替換”某些方法。 當您有一個巨大的 class 並且只想模擬某些方法(部分模擬)時,這很有用。 讓我引用Mockito 文檔

您可以創建真實對象的間諜。 當您使用 spy 時,會調用真正的方法(除非方法被存根)。

真正的間諜應該小心謹慎地偶爾使用,例如在處理遺留代碼時。

如有疑問,請使用模擬。

我將嘗試在這里使用示例進行解釋:

// Difference between mocking, stubbing and spying
@Test
public void differenceBetweenMockingSpyingAndStubbing() {
    List list = new ArrayList();
    list.add("abc");
    assertEquals(1, list.size());

    List mockedList = spy(list);
    when(mockedList.size()).thenReturn(10);
    assertEquals(10, mockedList.size());
}

在這里,我們有初始的真實 object list ,我們在其中添加了一個元素,預期大小為 1。

我們監視真正的 object 意味着我們可以指示要存根的方法。 所以我們聲明我們在spy object上存根方法 - size() ,無論實際大小是多少,它都會返回 10。

簡而言之,您將窺探真正的 object存根其中的一些方法

Mockito 警告部分 mocking 不是一個好的做法,您應該修改您的 Object 面向架構。 建議使用間諜(或部分模擬)來測試遺留代碼

基於Martin FowlerMocks Aren't Stubs

虛擬對象被傳遞但從未實際使用過。 通常它們僅用於填充參數列表。

對象實際上有工作實現,但通常采取一些捷徑,使它們不適合生產(memory 數據庫中的一個很好的例子)。

存根為測試期間撥打的電話提供預設答案,通常根本不響應任何超出測試程序的內容。

間諜是存根,它還根據調用方式記錄一些信息。 其中一種形式可能是 email 服務,它記錄發送了多少消息。

模擬就是我們在這里討論的內容:預先編程的對象具有期望,這些期望形成了它們期望接收的調用的規范。

在 Mockito 中,如果將任何 object 分配給 Mock Object 的實例變量,則不會影響 Mock Z4970437941514A355。

But in case of Spy, if you assign any object to instance variable of Spy Object then does affect on Spy Object because of Spy act like real-time object modification.

作為參考示例是

@RunWith(MockitoJUnitRunner.class)
public class MockSpyExampleTest {

    @Mock
    private List<String> mockList;

    @Spy
    private List<String> spyList = new ArrayList();

    @Test
    public void testMockList() {
        //by default, calling the methods of mock object will do nothing
        mockList.add("test");
        assertNull(mockList.get(0));
    }

    @Test
    public void testSpyList() {
        //spy object will call the real method when not stub
        spyList.add("test");
        assertEquals("test", spyList.get(0));
    }
}

參考: http://javapointers.com/tutorial/difference-between-spy-and-mock-in-mockito/

當使用模擬對象時,方法在非存根時的默認行為是什么都不做。 簡單的意思是,如果它是一個 void 方法,那么當你調用該方法時它什么也不做,或者如果它是一個有返回的方法,那么它可能會返回 null、空或默認值。

當然,在 spy 對象中,由於它是一個真實的方法,當您沒有對方法進行存根時,它會調用真實的方法行為。 如果要更改和模擬該方法,則需要對它進行存根。

間諜有兩個定義。 一個是調用真實方法的地方,另一個是不調用任何功能的地方,僅返回 null 或 null 等效值,但調用了方法,它們是 state 方法,通常記錄了 y 次。

如果我們想避免調用外部服務並且只想測試方法內部的邏輯,那么使用模擬。

如果我們想調用外部服務並使用真正的依賴,即按原樣運行程序並且只是存根特定的方法,那么使用 spy

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM