2.1 @Mock 註解

在 Mockito 中有兩種方法可以使用模擬對象。第一種是創建一個完全虛擬的對象,第二種是將現有對象包裝在包裝器中。讓我們從第一個開始。

要創建一個完全虛擬的對象,您需要編寫代碼:

ClassName variable name = Mockito.mock(ClassName.class);

讓我們創建一個模擬 ArrayList 類作為示例:

@ExtendWith(MockitoExtension.class)
class MockTest {
    @Test
    public void whenNotUseMockAnnotation_thenCorrect() {
        List mockList = Mockito.mock(ArrayList.class);
        //these methods won't do anything - they are stubs
        mockList.add("one");
        mockList.add("two");
    }
}

在此示例中,我們創建了一個偽造的 ArrayList 並將對它的引用存儲在 mockList 變量中。這個對象的方法什麼都不做。

順便說一下,這段代碼可以寫得更短,因為 this 有一個特殊的註解@Mock

@ExtendWith(MockitoExtension.class)
class MockTest {
    @Mock
    List mockList;

    @Test
    public void whenNotUseMockAnnotation_thenCorrect() {
        //these methods won't do anything - they are stubs
        mockList.add("one");
        mockList.add("two");
    }
}

在第二種情況下,MockitoExtension它將分析類代碼本身並創建必要的存根。您不需要調用該方法Mockito.mock()。一個註解和虛擬對象就準備好了。美麗。

2.2 @Spy註解

Mockito 中第二種重要的對像類型是現有對象的包裝器。一方面,它們允許使用現有類,另一方面,攔截對此類對象的所有方法和變量的調用:在必要時糾正它們的工作。它們的使用頻率與 Mock 對像一樣。

要在對像上創建包裝器,您需要編寫代碼:

ClassName variable name = Mockito.spy(an object);

一個圍繞 ArrayList 類進行包裝的示例:

@ExtendWith(MockitoExtension.class)
class SpyTest {
    @Test
    public void whenMockAnnotation() {
        List<String> mockList = Mockito.spy(new ArrayList<String>());
        //these methods will work!
        mockList.add("one");
        mockList.add("two");
    }
}

在其最簡單的形式中,對包裝器對象的調用只是將調用重定向到原始對象,即它保留在自身內部的引用。一切都會像原始對像一樣工作。

您還可以使用註釋創建包裝器 - @Spy

@ExtendWith(MockitoExtension.class)
class SpyTest {
    @Spy
    List mockList = new ArrayList<String>();

    @Test
    public void whenMockAnnotation() {
        // these methods will work!
        mockList.add("one");
        mockList.add("two");
    }
}

這兩個代碼示例是等效的。