Javaで引数のテストをしたいときはArgumentCaptorを使おう
Mockito ArgumentCaptor
モックしているオブジェクトのメソッドの引数を検証したい場合は、Mockito ArgumentCaptorを利用すると良いでしょう。
サンプル
public class Person { privatre String name; Person (String name) { this.name = name; } }
public class User { void varArgMethod(List<Person> list) { } }
public class UserTest { @Mock User user; @Test void test() { ArgumentCaptor<List> varArgs = ArgumentCaptor.forClass(List.class); verify(user).varArgMethod(varArgs.capture()); List expected = Arrays.asList(new Person("John"), new Person("Jane")); assertEquals(expected, varArgs.getAllValues()); } }
ArgumentCaptor.forClassメソッドでArgumentCaptorのインスタンスを生成し、 verify()でモックオブジェクトのメソッドが呼び出されていることをテストするのと同時に、その呼出引数をcapture()します。 引数がListの場合はgetAllValues()、List以外の場合はgetValue()で実際に呼び出された値を取得することができます。
@Captor
ArgumentCaptorの初期化には@Captorを代わりに使うこともできます。
public class UserTest { @Mock User user; @Test void test() { @Captor ArgumentCaptor<List> varArgs; verify(user).varArgMethod(varArgs.capture()); List expected = Arrays.asList(new Person("John"), new Person("Jane")); assertEquals(expected, varArgs.getAllValues()); } }
こちらのほうがより簡潔に書けて良いですね。