Edited at

AssertJで独自クラスのリストをテストする方法

More than 3 years have passed since last update.

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