AssertJで独自クラスのリストをテストする場合は、Extractを使うのが楽です。
例えば以下のようなクラスがあったとします。
public class User {
public String id;
public int rank;
public User(String id, int rank) {
this.id = id;
this.rank = rank;
}
}
そのときに、以下のリストをテストしたいとします。
List<User> users = new ArrayList<>();
users.add(new User("abc", 10));
users.add(new User("def", 20));
このときは、Extractorを使って以下のように書けます。まずクラスを使った書き方。
import static org.assertj.core.api.Assertions.*;
import org.assertj.core.api.iterable.Extractor;
import org.assertj.core.groups.Tuple;
// 1つ目が展開元、2つ目が展開先(通常はTuple)
public class UserExtractor implements Extractor<User, Tuple>
{
@Override
public Tuple extract(User user)
{
// tupleはObjectの可変長引数を取るメソッド
return tuple(user.id, user.rank);
}
}
テストは以下のようにします。
assertThat(users).extracting(new UserExtractor())
.contains(tuple("abc", 10))
.contains(tuple("def", 20));
もちろん、ラムダ式を使うことで、以下のように書けます。
assertThat(users).extracting((u) -> tuple(u.id, u.rank))
.contains(tuple("abc", 10))
.contains(tuple("def", 20));
以下のようにフィールド名を文字列で指定することも可能です。
assertThat(users).extracting("id", "rank")
.contains(tuple("abc", 10))
.contains(tuple("def", 20));