search
LoginSignup
8
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

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

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
8
Help us understand the problem. What are the problem?