web-dev-qa-db-ja.com

MockitoでClass <T>をパラメーターとして取るメソッドのスタブ

クラスをパラメーターとして使用する汎用メソッドがあり、Mockitoでスタブ化するのに問題があります。メソッドは次のようになります。

public <U extends Enum<U> & Error, T extends ServiceResponse<U>> T validate(
    Object target, Validator validator, Class<T> responseClass,
    Class<U> errorEnum);

少なくとも私にとっては恐ろしいことです...それなしで生きることは想像できますが、コードベースの残りの部分は喜んでそれを使用しています...

単体テストでは、このメソッドをスタブして、新しい空のオブジェクトを返します。しかし、mockitoでこれを行うにはどうすればよいですか?私は試した:

when(serviceValidatorStub.validate(
    any(), 
    isA(UserCommentRequestValidator.class), 
    UserCommentResponse.class, 
    UserCommentError.class)
).thenReturn(new UserCommentResponse());

しかし、私はマッチャーと生の値を混合して照合しているため、「org.mockito.exceptions.misusing.InvalidUseOfMatchersException:引数マッチャーの無効な使用!」

44
Peter Perháč

問題は、モックされた呼び出しで引数マッチャーと実際の引数を混在させることはできません。だから、むしろこれを行う:

_when(serviceValidatorStub.validate(
    any(),
    isA(UserCommentRequestValidator.class),
    eq(UserCommentResponse.class),
    eq(UserCommentError.class))
).thenReturn(new UserCommentResponse());
_

一致を一致させるためにeq()引数マッチャーを使用していることに注意してください。

参照: https://static.javadoc.io/org.mockito/mockito-core/1.10.19/org/mockito/Matchers.html#eq(T)

また、same()引数マッチャーを_Class<?>_タイプに使用できます。これは、_==_ Java演算子のように、同じIDに一致します。

81
Jesse

同じスレッドで完了するために、誰かがクラスを引数として取るメソッドをスタブしたいが、型を気にしない、または同じようにスタブされる多くの型が必要な場合、別の解決策があります:

private class AnyClassMatcher extends ArgumentMatcher<Class<?>> {

    @Override
    public boolean matches(final Object argument) {
        // We always return true, because we want to acknowledge all class types
        return true;
    }

}

private Class<?> anyClass() {
    return Mockito.argThat(new AnyClassMatcher());
}

そして、呼び出します

Mockito.when(mock.doIt(this.anyClass())).thenCallRealMethod();
2
Ash

素敵な1つ@Ash。汎用クラスマッチャーを使用して、以下を準備します。特定のタイプのモックを準備する場合に使用できます(インスタンスではありません)。

private Class<StreamSource> streamSourceClass() {
    return Mockito.argThat(new ArgumentMatcher<Class<StreamSource>>() {

        @Override
        public boolean matches(Object argument) {
            // TODO Auto-generated method stub
            return false;
        }
    });
}

使用法:

    Mockito.when(restTemplate.getForObject(Mockito.anyString(), 
            **streamSourceClass(),**
            Mockito.anyObject));
0
user3777313