1概要

このチュートリアルでは、

Mockito

APIの標準の静的

mock

メソッドのさまざまな使用方法について説明します。

Mockitoフレームワークに焦点を当てた他の記事(

Mockito Verify

または

Mockito When/Then

など)と同様に、以下に示す

MyList

クラスがモックアップするコラボレータとして使用されますテストケースでは:

public class MyList extends AbstractList<String> {
    @Override
    public String get(int index) {
        return null;
    }

    @Override
    public int size() {
        return 1;
    }
}


2単純モッキング


mock

メソッドの最も単純なオーバーロードされた変形は、モックされるクラスのための単一のパラメータを持つものです。

public static <T> T mock(Class<T> classToMock)

このメソッドを使ってクラスをモックし、期待値を設定します。

MyList listMock = mock(MyList.class);
when(listMock.add(anyString())).thenReturn(false);

それからモックでメソッドを実行します。

boolean added = listMock.add(randomAlphabetic(6));

次のコードは、

add

メソッドがモック上で呼び出されたこと、そして呼び出しが前に設定した期待に一致する値を返すことを確認します。

verify(listMock).add(anyString());
assertThat(added, is(false));


3モックの名前でモックする

このセクションでは、モックの名前を指定する引数を使って提供される

mock

メソッドの他の変形をカバーします。

public static <T> T mock(Class<T> classToMock, String name)

一般的に言って、モックの名前は作業コードとは無関係ですが、モックの名前が検証エラーを追跡するために使用されるデバッグに関しては有用かもしれません。

提供されたモックの名前が、失敗した検証からスローされた例外のメッセージに含まれるようにするために、

ExpectedException

と呼ばれる

__TestRul

__eインターフェースのJUnit実装を信頼し、それをテストクラスに含めます。

@Rule
public ExpectedException thrown = ExpectedException.none();

この規則はテストメソッドから投げられる例外を処理するために使用されます。

次のコードでは、

MyList

クラスのモックを作成し、

myMock

という名前を付けます。

MyList listMock = mock(MyList.class, "myMock");

その後、モックのメソッドに期待値を設定して実行します。

when(listMock.add(anyString())).thenReturn(false);
listMock.add(randomAlphabetic(6));

意図的に失敗した検証を作成し、モックに関する情報を含むメッセージで例外をスローします。そのためには、例外に対する期待を最初に設定する必要があります。

thrown.expect(TooLittleActualInvocations.class);
thrown.expectMessage(containsString("myMock.add"));

次の検証は失敗し、予想されたものと一致する例外がスローされます。

verify(listMock, times(2)).add(anyString());

これが、スローされた例外のメッセージです。

org.mockito.exceptions.verification.TooLittleActualInvocations:
myMock.add(<any>);
Wanted 2 times:
at com.baeldung.mockito.MockitoMockTest
  .whenUsingMockWithName__thenCorrect(MockitoMockTest.java:...)
but was 1 time:
at com.baeldung.mockito.MockitoMockTest
  .whenUsingMockWithName__thenCorrect(MockitoMockTest.java:...)

ご覧のように、モックの名前が例外メッセージに含まれています。これは、検証が失敗した場合に失敗箇所を見つけるのに役立ちます。


4

Answer


でモックする

ここでは、モックのインタラクションに対する答えの戦略が作成時に設定される

mock

バリアントの使い方を示します。 Mockitoドキュメントのこの

mock

メソッドのシグネチャは次のようになります。

public static <T> T mock(Class<T> classToMock, Answer defaultAnswer)


Answer

インターフェースの実装の定義から始めましょう。

class CustomAnswer implements Answer<Boolean> {
    @Override
    public Boolean answer(InvocationOnMock invocation) throws Throwable {
        return false;
    }
}

上記の

CustomAnswer

クラスはモックの生成に使用されます。

MyList listMock = mock(MyList.class, new CustomAnswer());

メソッドに期待値を設定しないと、

CustomAnswer

タイプによって設定されたデフォルトの回答が有効になります。それを証明するために、期待値設定ステップを飛ばしてメソッド実行にジャンプします。

boolean added = listMock.add(randomAlphabetic(6));

次の検証とアサーションは、

Answer

引数を持つ

mock

メソッドが期待どおりに機能したことを確認します。

verify(listMock).add(anyString());
assertThat(added, is(false));


5

MockSettings


でモックする

この記事で扱う最後の

mock

メソッドは、

MockSettings

タイプのパラメーターを持つバリアントです。このオーバーロードされたメソッドは、非標準のモックを提供するために使用されます。


MockSettings

インターフェースのメソッドでサポートされているカスタム設定がいくつかあります。たとえば、現在のモックでのメソッド呼び出しのリスナーの登録、

serializable

によるシリアル化の設定、

spiedInstance

による監視対象インスタンスの指定、使用するMockitoの設定

useConstructor

を使用してモックをインスタンス化するときのコンストラクタ、およびその他。

便宜上、前のセクションで紹介した

CustomAnswer

クラスを再利用して、デフォルトの回答を定義する

MockSettings

実装を作成します。


MockSettings

オブジェクトは、次のようにファクトリメソッドによってインスタンス化されます。

MockSettings customSettings = withSettings().defaultAnswer(new CustomAnswer());

その設定オブジェクトは、新しいモックの作成に使用されます。

MyList listMock = mock(MyList.class, customSettings);

前のセクションと同様に、

MyList

インスタンスの

add

メソッドを呼び出し、

MockSettings

引数を指定した

mock

メソッドが次のコードスニペットを使用して意図したとおりに機能することを確認します。

boolean added = listMock.add(randomAlphabetic(6));
verify(listMock).add(anyString());
assertThat(added, is(false));


6. 結論

このチュートリアルではMockitoの

mock

メソッドについて詳しく説明しました。これらの例とコードスニペットの実装はhttps://github.com/eugenp/tutorials/tree/master/testing-modules/mockito[GitHubプロジェクト]にあります。