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");
    }
}

这两个代码示例是等效的。