JUnitのAssertJの使い方

JUnitのAssertJの使い方

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

文字列の検証は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");
}
}

view raw
gistfile1.txt
hosted with ❤ by GitHub

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

view raw
gistfile1.txt
hosted with ❤ by GitHub

文字列が含まれている場合の検証は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
}
}

view raw
gistfile1.txt
hosted with ❤ by GitHub

文字列の最初の文字列の検証は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
}
}

view raw
gistfile1.txt
hosted with ❤ by GitHub

文字列の最後の文字列の検証は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
}
}

view raw
gistfile1.txt
hosted with ❤ by GitHub

真偽値の比較は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();
}
}

view raw
gistfile1.txt
hosted with ❤ by GitHub

数値範囲の検証は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
}
}

view raw
gistfile1.txt
hosted with ❤ by GitHub

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
}
}

view raw
gistfile1.txt
hosted with ❤ by GitHub

コレクションのサイズは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の引数にはコレクションインスタンスを渡す
}
}

view raw
gistfile1.txt
hosted with ❤ by GitHub

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

view raw
gistfile1.txt
hosted with ❤ by GitHub

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

view raw
gistfile1.txt
hosted with ❤ by GitHub

どのクラスのインスタンスかを検証するには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);
}
}

view raw
gistfile1.txt
hosted with ❤ by GitHub

インスタンスのリストを検証するには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"); // 値を検証する
}
}

view raw
gistfile1.txt
hosted with ❤ by GitHub

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)); // 各フィールドの値を検証することが可能
}
}

view raw
gistfile1.txt
hosted with ❤ by GitHub

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

テストで例外発生しないことを検証するには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();
}
}

view raw
gistfile1.txt
hosted with ❤ by GitHub

コレクションクラスのすべての値を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); // フィールド名と値の検証
}
}

view raw
gistfile1.txt
hosted with ❤ by GitHub

フィルターした要素だけを検証する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);
}
}

view raw
gistfile1.txt
hosted with ❤ by GitHub

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
}
}

view raw
gistfile1.txt
hosted with ❤ by GitHub

assertThatThrownByで例外を検証

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

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

view raw
SampleTest.java
hosted with ❤ by GitHub

スポンサーリンク
  • このエントリーをはてなブックマークに追加
  • Evernoteに保存Evernoteに保存
スポンサーリンク

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA