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