私はjUnitを使用してテストしたいかなり複雑なJava関数があり、この目的でMockitoを使用しています。この関数は次のようになります。
_public void myFunction (Object parameter){
...
doStuff();
...
convert(input,output);
...
parameter.setInformationFrom(output);
}
_
関数convertは、入力に応じて出力の属性を設定します。これはvoid型関数ですが、「output」パラメーターは、関数によって返されるかのように使用されます。この変換関数は、テストの入力に依存する必要がないため、モックアップしたいものですが、Mockitoにあまり詳しくないため、これを行う方法はわかりません。
基本的なケースはwhen(something).thenReturn(somethingElse)
またはdoAnswerメソッドが以前のものに似ていると理解していますが、より多くのロジックを追加することができますが、これらのケースが私のケースに適しているとは思いません私の関数にはreturnステートメントがありません。
モックされたメソッドでパラメーターのメソッドを呼び出す(または変更する)場合は、この質問のようにAnswerを記述する必要があります( "オブジェクトに影響するvoidリターンメソッドをモックする方法" =)。
Kevin Welker の answer から:
doAnswer(new Answer() {
Object answer(InvocationOnMock invocation) {
Object[] args = invocation.getArguments();
((MyClass)args[0]).myClassSetMyField(NEW_VALUE);
return null; // void method, so return null
}
}).when(mock).someMethod();
新しいベストプラクティスには、Answer<Void>
のようにAnswerの型パラメーターがあり、Java 8のラムダは構文をさらに圧縮できます。たとえば、次のようになります。
doAnswer(invocation -> {
Object[] args = invocation.getArguments();
((MyClass)args[0]).myClassSetMyField(NEW_VALUE);
return null; // void method in a block-style lambda, so return null
}).when(mock).someMethod();