web-dev-qa-db-ja.com

void関数の入力パラメーターを変更し、後で読み取る

私は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ステートメントがありません。

34
Juan

モックされたメソッドでパラメーターのメソッドを呼び出す(または変更する)場合は、この質問のようにAnswerを記述する必要があります( "オブジェクトに影響するvoidリターンメソッドをモックする方法" =)。

Kevin Welkeranswer から:

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();
62
Jeff Bowman