私は外部サービスのモックしたい関数のシグネチャを持っています。
public <T> void save(T item, AnotherClass anotherClassObject);
この関数シグニチャを考えると、クラス名IGenericService
1はPowerMockでそれを模擬できますか?それともMockito?
このジェネリックのために、私が使用しています。クラスTheodore
でのTのためにT item
。例えば、私が使用してみました:
doNothing().when(iGenericServiceMock.save(any(Theodore.class),
any(AnotherClass.class));
IntelliJのは、このクランク:
save(T, AnotherClass) cannot be applied to
(org.Hamcrest.Matcher<Theodore>, org.Hamcrest.Matcher<AnotherClass>)
そして、それは以下の理由を挙げています:
reason: No instance(s) of type variable T exist
so that Matcher<T> conforms to AnotherClass
まず、問題はジェネリック引数が適切に処理された場合に解決するべきです。1は、このような状況で行うことができますいくつかのものは何ですか?
UPDATE:ETOが共有したよう:
doNothing().when(mockedObject).methodToMock(argMatcher);
同じ運命を共有しています。
あなたはに誤ったパラメータを渡していますwhen
。これは混乱のビットであってもよいが、二つの異なる用途があるwhen
方法は、(実際には、これら2つの異なる方法です)。
when(mockedObject.methodYouWantToMock(expectedParameter, orYourMatcher)).thenReturn(objectToReturn);
doReturn(objectToReturn).when(mockedObject).methodYouWantToMock(expectedParameter, orYourMatcher);
注:の入力パラメータに注意を払うwhen
どちらの場合も方法。
あなたの特定のケースでは、このような何かを行うことができます:
doReturn(null).when(iGenericServiceMock).save(any(Theodore.class), any(AnotherClass.class));
これは、あなたのコンパイルの問題を修正します。しかし、テストはして実行時に失敗しますorg.mockito.exceptions.misusing.CannotStubVoidMethodWithReturnValue
あなたから何かを返すようにしようとしているためvoid
の方法(null
ではありませんvoid
)。あなたがすべきことは次のとおりです。
doNothing().when(iGenericServiceMock).save(any(Theodore.class), any(AnotherClass.class));
後で、使用して、モックとの相互作用を確認することができますverify
方法を。
更新:
あなたの輸入を確認してください。あなたは使用する必要がありますorg.mockito.Matchers.any
代わりにorg.hamcrest.Matchers.any
。