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");
}
}
這兩個代碼示例是等效的。
GO TO FULL VERSION