1.概要

このクイックチュートリアルでは、モックオブジェクトを作成する3つの異なる方法と、それらが互いにどのように異なるかを確認します。MockitoとSpringモックサポートです。

2.

Mockito.mock()


Mockito.mock()

メソッドを使用すると、クラスまたはインタフェースのモックオブジェクトを作成できます。

その後、モックを使用してそのメソッドの戻り値をスタブし、それらが呼び出されたかどうかを確認できます。

例を見てみましょう。

@Test
public void givenCountMethodMocked__WhenCountInvoked__ThenMockedValueReturned() {
    UserRepository localMockRepository = Mockito.mock(UserRepository.class);
    Mockito.when(localMockRepository.count()).thenReturn(111L);

    long userCount = localMockRepository.count();

    Assert.assertEquals(111L, userCount);
    Mockito.verify(localMockRepository).count();
}

この方法を使用する前に、他に必要な作業はありません。

これを使用して、メソッド内のモッククラスフィールドおよびローカルモックを作成できます。

3. Mockitoの

@ Mock

アノテーション

このアノテーションは

Mockito.mock()

メソッドの省略形です。同様に、テストクラスでのみ使うべきです。

mock()

メソッドとは異なり、Mockitoアノテーションがこのアノテーションを使用できるようにする必要があります。

これを行うには、

MockitoJUnitRunner

を使用してテストを実行するか、または

MockitoAnnotations.initMocks()

メソッドを明示的に呼び出します。


MockitoJUnitRunner

を使用した例を見てみましょう。

@RunWith(MockitoJUnitRunner.class)
public class MockAnnotationUnitTest {

    @Mock
    UserRepository mockRepository;

    @Test
    public void givenCountMethodMocked__WhenCountInvoked__ThenMockValueReturned() {
        Mockito.when(mockRepository.count()).thenReturn(123L);

        long userCount = mockRepository.count();

        Assert.assertEquals(123L, userCount);
        Mockito.verify(mockRepository).count();
    }
}

コードを読みやすくすることとは別に、**

@ Mock

を使用すると、失敗した場合に問題のモックを簡単に見つけることができます。これは、フィールドの名前が失敗メッセージに表示されるためです。

Wanted but not invoked:
mockRepository.count();
-> at org.baeldung.MockAnnotationTest.testMockAnnotation(MockAnnotationTest.java:22)
Actually, there were zero interactions with this mock.

  at org.baeldung.MockAnnotationTest.testMockAnnotation(MockAnnotationTest.java:22)

また、

@ InjectMocks

と組み合わせて使用​​すると、セットアップコードの量を大幅に減らすことができます。

4. Spring Bootの

@ MockBean

アノテーション

Springアプリケーションコンテキストにモックオブジェクトを追加するために

@ MockBean

を使うことができます。モックは、アプリケーションコンテキスト内の同じタイプの既存のBeanを置き換えます。

同じタイプのBeanが定義されていない場合は、新しいBeanが追加されます。この注釈は、特定のBean(たとえば外部サービス)をモックする必要がある統合テストで役立ちます。

このアノテーションを使うには、テストを実行するために

SpringRunner

を使わなければなりません:

@RunWith(SpringRunner.class)
public class MockBeanAnnotationIntegrationTest {

    @MockBean
    UserRepository mockRepository;

    @Autowired
    ApplicationContext context;

    @Test
    public void givenCountMethodMocked__WhenCountInvoked__ThenMockValueReturned() {
        Mockito.when(mockRepository.count()).thenReturn(123L);

        UserRepository userRepoFromContext = context.getBean(UserRepository.class);
        long userCount = userRepoFromContext.count();

        Assert.assertEquals(123L, userCount);
        Mockito.verify(mockRepository).count();
    }
}

アプリケーションコンテキストに登録されているだけでなく、フィールドに注釈を使用すると、モックもフィールドに挿入されます。

これは上記のコードで明らかです。ここでは、注入された

__UserRepository


mockを使用して


count


method

をスタブしました。次に、アプリケーションコンテキストからのBeanを使用して、それが実際にモックされたBeanであることを確認しました。

5.まとめ

この記事では、モック・オブジェクトを作成するための3つの方法がどのように異なり、それぞれをどのように使用できるかを見ました。

この記事に付随するソースコードはhttps://github.com/eugenp/tutorials/tree/master/testing-modules/spring-testing[GitHubで利用可能]です。