クラスをパラメーターとして使用する汎用メソッドがあり、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:引数マッチャーの無効な使用!」
問題は、モックされた呼び出しで引数マッチャーと実際の引数を混在させることはできません。だから、むしろこれを行う:
_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に一致します。
同じスレッドで完了するために、誰かがクラスを引数として取るメソッドをスタブしたいが、型を気にしない、または同じようにスタブされる多くの型が必要な場合、別の解決策があります:
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();
素敵な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));