JUnitのAssertJの使い方

JUnitのAssertJの使い方

JUnitの検証でよく使うAssertJの使い方です。以下などをstaticインポートしておきます。

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.within;
import static org.assertj.core.api.Assertions.tuple;

文字列の検証はisEqualToメソッド

文字列はassertThat(“文字列”).isEqualToメソッドで検証します。

package jp.co.test;

import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertTrue;

import org.junit.jupiter.api.Test;

public class MainTest {

  @Test
  public void test1() {
    String str = "hoge";
    assertThat(str).isEqualTo("hoge");
  }
}

nullの検証はisNullメソッド

値がnullの場合の検証はisNullメソッドを使用します。nullでない場合の検証はisNotNullメソッドを使用します。

package jp.co.test;

import static org.assertj.core.api.Assertions.assertThat;

import org.junit.jupiter.api.Test;

public class MainTest {

  @Test
  public void test1() {
    String nullvalue = null;
    assertThat(nullvalue).isNull();
    nullvalue = "abc";
    assertThat(nullvalue).isNotNull();
  }
}

文字列が含まれている場合の検証はcontainsメソッド

文字列が含まれている場合の検証はcontainsメソッドを使用します。

package jp.co.test;

import static org.assertj.core.api.Assertions.assertThat;

import org.junit.jupiter.api.Test;

public class MainTest {

  @Test
  public void test1() {
    String str = "hello";
    assertThat(str).contains("llo"); // 文字列が含まれていればOK
  }
}

文字列の最初の文字列の検証はstartsWithメソッド

startsWithメソッドの引数で始まる文字列であるかどうかを検証します。startsWithの否定はdoesNotStartWithメソッドです。

package jp.co.test;

import static org.assertj.core.api.Assertions.assertThat;

import org.junit.jupiter.api.Test;

public class MainTest {

  @Test
  public void test1() {
    String str = "hello";
    assertThat(str).startsWith("he"); // 先頭文字列があっていればOK
    assertThat(str).doesNotStartWith("el");// 先頭文字列はelではないのでOK
  }
}

文字列の最後の文字列の検証はendsWithメソッド

endsWithメソッドの引数で終わっている文字列であるかどうかを検証します。endsWithの否定はdoesNotEndWithメソッドです。

package jp.co.test;

import static org.assertj.core.api.Assertions.assertThat;

import org.junit.jupiter.api.Test;

public class MainTest {

  @Test
  public void test1() {
    String str = "hello";
    assertThat(str).endsWith("llo"); // 末尾文字列があっていればOK
    assertThat(str).doesNotEndWith("ll");// 末尾文字列はelではないのでOK
  }
}

真偽値の比較はisTrue,isFalse

真偽値はassertThatのisTrue,isFalseメソッドで検証します。

package jp.co.test;

import static org.junit.jupiter.api.Assertions.assertTrue;

import org.junit.jupiter.api.Test;

public class MainTest {
  @Test
  public void test1() {
    Boolean bool = Boolean.TRUE;
    assertThat(bool).isTrue();
  }
}

数値範囲の検証はisBetweenメソッド

数値が範囲内であるかどうかの検証はisBetweenメソッドで検証します。intでもlongでもIntegerでもLongでも検証可能です。

package jp.co.test;

import static org.assertj.core.api.Assertions.assertThat;

import org.junit.jupiter.api.Test;

public class MainTest {
  @Test
  public void test1() {
    Long l = 1L;
    assertThat(l).isBetween(0L, 2L); // 1Lは0L~2Lの範囲内なのでOK
  }
}

isCloseToメソッドでも範囲の検証が可能です。withinを使います。

第一引数 第二引数
基底値(10) ±値(2)

上記だと、10±2の範囲(8~12)なら検証はOKです。

package jp.co.test;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.within;

import org.junit.jupiter.api.Test;

public class MainTest {

  @Test
  public void test1() {
    Integer i = 12;
    assertThat(i).isCloseTo(10, within(2)); // iが10±2の範囲ならOK
  }
}

コレクションのサイズはhasSizeメソッド

コレクションのサイズはhasSizeメソッドで検証します。

package jp.co.test;

import static org.assertj.core.api.Assertions.assertThat;

import java.util.Arrays;
import java.util.List;

import org.junit.jupiter.api.Test;

public class MainTest {

  @Test
  public void test1() {
    List<String> list = Arrays.asList("abc");
    assertThat(list).hasSize(1); //assertThatの引数にはコレクションインスタンスを渡す
  }
}

LocalDateの検証

LocalDateを検証するにはisEqualToメソッドで検証が可能です。引数にはLocalDateのインスタンスを渡す必要があります。

package jp.co.test;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.within;

import java.time.LocalDate;

import org.junit.jupiter.api.Test;

public class MainTest {

  @Test
  public void test1() {
    LocalDate ld = LocalDate.of(2019, 11, 13);
    assertThat(ld).isEqualTo(LocalDate.of(2019, 11, 13));
  }
}

LocalDateTimeの検証

LocalDateTimeの検証もLocalDateと同じく、isEqualToメソッドで行います。

package jp.co.test;

import static org.assertj.core.api.Assertions.assertThat;

import java.time.LocalDateTime;

import org.junit.jupiter.api.Test;

public class MainTest {
  @Test
  public void test1() {
    LocalDateTime date = LocalDateTime.of(2019,1,1,1,1);
    assertThat(date).isEqualTo(LocalDateTime.of(2019,1,1,1,1));
  }
}

どのクラスのインスタンスかを検証するにはisInstanceOf

インスタンス変数がどのクラスのインスタンスかを検証するにはisInstanceOfメソッドを使用します。

package jp.co.test;

import static org.assertj.core.api.Assertions.assertThat;

import org.junit.jupiter.api.Test;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;

public class MainTest {
  @Getter
  @Setter
  @AllArgsConstructor
  class Emp {
    private String name;
    private Integer age;
  }

  @Test
  public void test1() {
    Emp emp = new Emp("takahashi", 20);
    assertThat(emp).isInstanceOf(Emp.class);
  }
}

インスタンスのリストを検証するにはextracting

インスタンスのリストを検証するにはextractingメソッドを使用します。

例えば従業員クラスのインスタンスのリストの検証をしたい場合に各フィールドの値を検証することが可能です。これはとても便利です。

package jp.co.test;

import static org.assertj.core.api.Assertions.assertThat;

import java.util.Arrays;
import java.util.List;

import org.junit.jupiter.api.Test;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;

public class MainTest {
  @Getter
  @Setter
  @AllArgsConstructor
  class Emp {
    private String name;
    private Integer age;
  }

  @Test
  public void test1() {
    Emp emp1 = new Emp("takahashi", 20);
    Emp emp2 = new Emp("higashiguchi", 30);
    List<Emp> employees = Arrays.asList(emp1,emp2);
    assertThat(employees)
      .extracting("name") // nameフィールド
      .containsExactly("takahashi","higashiguchi"); // 値を検証する
  }
}

tupleで異なる型のフィールドを一括で検証

assertJを使えばtuple(タプル)が使えます。オブジェクトの異なる型の各フィールドを一度に検証することが可能です。containsExactlyメソッドは順序が関係あるので、任意の順序で検証したい場合はcontainsExactlyInAnyOrderメソッドを使います。

package jp.co.test;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.tuple;

import java.util.Arrays;
import java.util.List;

import org.junit.jupiter.api.Test;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;

public class MainTest {
  @Getter
  @Setter
  @AllArgsConstructor
  class Emp {
    private String name;
    private Integer age;
  }

  @Test
  public void test1() {
    Emp emp1 = new Emp("takahashi", 20);
    Emp emp2 = new Emp("higashiguchi", 30);
    List<Emp> employees = Arrays.asList(emp1,emp2);
    assertThat(employees)
      .extracting("name", "age") // StringとInteger
      .containsExactly(tuple("takahashi",20),tuple("higashiguchi",30)); // 各フィールドの値を検証することが可能
  }
}

例外発生しないことを検証する

テストで例外発生しないことを検証するにはassertThatCodeのdoesNotThrowAnyExceptionメソッドを使用します。

package jp.co.test;

import static org.assertj.core.api.Assertions.assertThatCode;

import org.junit.jupiter.api.Test;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;

public class MainTest {
  @Test
  public void test1() {
    assertThatCode(()->{
    int i = 1/0; // ArithmeticExceptionが発生する為、テストはNG
    }).doesNotThrowAnyException();
  }
}

コレクションクラスのすべての値をelmentで検証

要素が複数あり、かつ、その値を検証したい場合element(要素番号)で最初の要素を取得できます。

hasFieldOrProperty、hasFieldOrPropertyWithValueメソッドで検証可能ですが、containsExactlyとtupleの方が便利です。

package jp.co.test;

import static org.assertj.core.api.Assertions.assertThat;

import java.util.Arrays;
import java.util.List;

import org.junit.jupiter.api.Test;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;

public class MainTest {
  @Getter
  @Setter
  @AllArgsConstructor
  class Emp {
    private String name;
    private Integer age;
  }
  @Test
  public void test1() {
    Emp emp1 = new Emp("takahashi", 20);
    Emp emp2 = new Emp("higashiguchi", 30);
    List<Emp> employees = Arrays.asList(emp1, emp2);
    assertThat(employees)
      .element(0) // 0番目の要素
      .hasFieldOrProperty("name") // フィールド名の検証
      .hasFieldOrPropertyWithValue("name","takahashi") // フィールド名と値の検証
      .hasFieldOrPropertyWithValue("age",20); // フィールド名と値の検証
    assertThat(employees)
      .element(1) // 1番目の要素
      .hasFieldOrProperty("name") // フィールド名の検証
      .hasFieldOrPropertyWithValue("name","higashiguchi") // フィールド名と値の検証
      .hasFieldOrPropertyWithValue("age", 30); // フィールド名と値の検証
  }
}

フィルターした要素だけを検証するfilteredOn

コレクション要素のうち、特定条件の要素のみテストしたい場合はfilteredOnメソッドで要素を特定しておきます。

package jp.co.test;

import static org.assertj.core.api.Assertions.assertThat;

import java.util.Arrays;
import java.util.List;

import org.junit.jupiter.api.Test;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;

public class MainTest {
  @Getter
  @Setter
  @AllArgsConstructor
  class Emp {
    private String name;
    private Integer age;
  }
  @Test
  public void test1() {
    Emp emp1 = new Emp("takahashi", 20);
    Emp emp2 = new Emp("higashiguchi", 30);
    List<Emp> employees = Arrays.asList(emp1, emp2);
    assertThat(employees)
      .filteredOn(e -> e.getAge() >= 25) // 25歳以上の従業員のみ抽出する
      .element(0) // 抽出した要素のうちの0番目の要素から検証する
      .hasFieldOrProperty("name")
      .hasFieldOrPropertyWithValue("name","higashiguchi")
      .hasFieldOrPropertyWithValue("age", 30);
  }
}

POJOの全フィールドの検証をするisEqualToComparingFieldByField

isEqualToComparingFieldByFieldメソッドで全フィールドがいっちしいるかの検証をすることができます。

package jp.co.test;

import static org.assertj.core.api.Assertions.assertThat;

import org.junit.jupiter.api.Test;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;

public class MainTest {
  @Getter
  @Setter
  @AllArgsConstructor
  class Emp {
    private String name;
    private Integer age;
  }
  @Test
  public void test1() {
    Emp emp1 = new Emp("takahashi", 20);
    Emp emp2 = new Emp("takahashi", 20);
    assertThat(emp1).isEqualToComparingFieldByField(emp2); // 全フィールドが一致する場合のみOK
  }
}

assertThatThrownByで例外を検証

assertThatThrownByを使ってテスト対象のメソッドが特定の例外をスローする検証をすることが出来ます。ここでは、HogeExceptionとします。

  assertThatThrownBy(() -> service.getXXX("test")) // test対象メソッド
    .isInstanceOfSatisfying(
      HogeException.class,
        e -> {
          assertThat(e.getMessage()).isEqualTo("hoge error"); // ここで検証
        });

コメント

タイトルとURLをコピーしました