【Spring Boot】 Bean ValidationをJUnitで単体テストする
実行環境
- 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");
}
}