【Spring Boot】 Bean ValidationをJUnitで単体テストする

2020年8月29日

実行環境

  • Spring Boot 2.2.6
  • Java11
  • assertJ 3.15.0

テスト対象のコード

以下のBeanクラスのバリデーションをテスト対象とする。countに対する最小値チェックとtoとmessageに対する相関チェックを行う。相関チェックの実装方法はSpring Bean Validationで相関チェックを行うにまとめている。

Lombokを使用しGetter, Setter,コンストラクタを生成している。

// import文は省略
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Greeting {

    private String to;
    private String message;

    @Min(value = 10L)
    private int count;

   // toが入力された場合はmessageを必須入力とする
    @AssertTrue(message = "message must not be empty if to is not empty.")
    public boolean getMessageNotEmptyIfToPresents() {

        if (StringUtils.isEmpty(to)) {
            return true;
        }

        return !StringUtils.isEmpty(message);
    }
}

JUnitでのテストコード

JUnitでは以下のようにテストすることができる。

// import文は省略

@SpringBootTest
public class ValidationTest {

    private Validator validator = Validation.buildDefaultValidatorFactory().getValidator();

    @Test
    public void test() {

        // countに対する最小値チェックと相関チェックがエラーとなる
        Greeting2 greeting2 = new Greeting2("hoge", "", 9);

     // violation数が2となる。
        Set<ConstraintViolation<Greeting2>> violations = validator.validate(greeting2);
        assertThat(violations.size()).isEqualTo(1);
    }
}

複数のバリデーションを持つBeanクラスのバリデーションをテストする際に一部バリデーションのみエラーとなるテストケースを作りたい場合がある。この場合、上記のようにエラー数のみでは意図したバリデーションエラーが発生しているか分からない。

そこで、以下の例のようにバリデーションエラーの内容をConstraintViolationクラスのmessageによって判定する。

// import文は省略

@SpringBootTest
public class ValidationTest {

    private Validator validator = Validation.buildDefaultValidatorFactory().getValidator();

    @Test
    public void test() {

        // countに対する最小値チェックのみエラーとなる
        Greeting2 greeting2 = new Greeting2("", "", 9);

     // violation数が1となる。
        Set<ConstraintViolation<Greeting2>> violations = validator.validate(greeting2);
        assertThat(violations.size()).isEqualTo(1);

        // ConstraintViolationクラスのmessageをチェックする。
        assertThat(violations).extracting("message").containsOnly("must be greater than or equal to 10");
    }
}