2.1 @Mock アノテーション

Mockito でモック オブジェクトを操作するには 2 つの方法があります。1 つ目は完全な仮想オブジェクトを作成すること、2 つ目は既存のオブジェクトをラッパーでラップすることです。最初のものから始めましょう。

完全仮想オブジェクトを作成するには、次のコードを記述する必要があります。

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 を作成し、それへの参照をモックリスト変数に保存します。このオブジェクトのメソッドは何も行いません。

ちなみに、この には特別なアノテーションがあるため、このコードはさらに短く書くことができます@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");
    }
}

2 番目のケースでは、MockitoExtensionクラス コード自体を分析し、必要なスタブを作成します。メソッドを呼び出す必要はありませんMockito.mock()。1 つの注釈と仮想オブジェクトが準備完了です。美しさ。

2.2 @Spy アノテーション

Mockito の 2 番目に重要なオブジェクトのタイプは、既存のオブジェクトのラッパーです。これにより、一方では既存のクラスを使用することができ、他方ではそのようなオブジェクトのすべてのメソッドと変数への呼び出しをインターセプトして、必要に応じてその動作を修正することができます。これらは、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");
    }
}

これら 2 つのコード例は同等です。