nologyance.net

日々のアウトプット

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());
  }
}

こちらのほうがより簡潔に書けて良いですね。