반응형
Controller에서 입력받는 Dto 클래스에 @Valid로 유효성 검사를 할 때, 테스트 코드를 작성하는 방법을 찾아봤다. 크게 WebMvcTest로 Controller를 테스트 하는 방법과 Validator를 사용해서 테스트 하는 방법 두 가지를 찾을 수 있었다.
오직 Dto의 유효성 검사만 테스트 하고 싶었기 때문에 Validator를 사용해서 테스트 하는 방법을 사용했다.
Validator로 Dto 유효성 검사
커스텀 유효성 검사가 없기 때문에 기본적으로 제공되는 ValidatorFactory, Validator를 사용해서 테스트 했다. validator의 validateProperty 메서드로 원하는 필드의 유효성 검사만 진행했는데, validate 메서드로 한 번에 모든 필드를 검사할 수도 있다. 처음에는 메세지 내용으로 검증할까 생각했는데, size가 더 간단하기도 하고 의미가 같다고 생각했다.
참고용으로 작성한 테스트 코드를 슬쩍..
@ActiveProfiles("test")
class MemberCreateRequestTest {
private static ValidatorFactory validatorFactory;
private static Validator validator;
@BeforeAll
static void setValidator() {
validatorFactory = Validation.buildDefaultValidatorFactory();
validator = validatorFactory.getValidator();
}
@Nested
@DisplayName("Username 테스트")
class UsernameTest {
@Test
public void Given_ValidUsername_When_Validate_Then_NoConstraintViolation() {
//given
MemberCreateRequest validRequest =
new MemberCreateRequest("username1", "password");
//when
Set<ConstraintViolation<MemberCreateRequest>> valid =
validator.validateProperty(validRequest, "username");
//then
assertThat(valid.size()).isEqualTo(0);
}
@Test
public void Given_InvalidSizeUsername_When_Validate_Then_HasConstraintViolation() {
//given
MemberCreateRequest sizeOverRequest =
new MemberCreateRequest("usernamesizeover", "password");
MemberCreateRequest sizeUnderRequest =
new MemberCreateRequest("u", "password");
//when
Set<ConstraintViolation<MemberCreateRequest>> sizeOver =
validator.validateProperty(sizeOverRequest, "username");
Set<ConstraintViolation<MemberCreateRequest>> sizeUnder =
validator.validateProperty(sizeUnderRequest, "username");
//then
assertThat(sizeOver.size()).isGreaterThan(0);
assertThat(sizeUnder.size()).isGreaterThan(0);
}
@Test
public void Given_InvalidPatternUsername_When_Validate_Then_HasConstraintViolation() {
//given
MemberCreateRequest upperCaseRequest =
new MemberCreateRequest("Invalid", "password");
MemberCreateRequest notEnglishRequest =
new MemberCreateRequest("한글이름", "password");
//when
Set<ConstraintViolation<MemberCreateRequest>> upperCase =
validator.validateProperty(upperCaseRequest, "username");
Set<ConstraintViolation<MemberCreateRequest>> notEnglish =
validator.validateProperty(notEnglishRequest, "username");
//then
assertThat(upperCase.size()).isGreaterThan(0);
assertThat(notEnglish.size()).isGreaterThan(0);
}
}
@Nested
@DisplayName("Password 테스트")
class PasswordTest {
@Test
public void Given_ValidPassword_When_Validate_Then_NoConstraintViolation() {
//given
MemberCreateRequest validRequest =
new MemberCreateRequest("username1", "passworD1");
//when
Set<ConstraintViolation<MemberCreateRequest>> valid =
validator.validateProperty(validRequest, "password");
//then
assertThat(valid.size()).isEqualTo(0);
}
@Test
public void Given_InvalidSizePassword_When_Validate_Then_HasConstraintViolation() {
//given
MemberCreateRequest sizeOverRequest =
new MemberCreateRequest("username", "password123456789");
MemberCreateRequest sizeUnderRequest =
new MemberCreateRequest("username", "pass");
//when
Set<ConstraintViolation<MemberCreateRequest>> sizeOver =
validator.validateProperty(sizeOverRequest, "password");
Set<ConstraintViolation<MemberCreateRequest>> sizeUnder =
validator.validateProperty(sizeUnderRequest, "password");
//then
assertThat(sizeOver.size()).isGreaterThan(0);
assertThat(sizeUnder.size()).isGreaterThan(0);
}
@Test
public void Given_InvalidPatternPassword_When_Validate_Then_HasConstraintViolation() {
//given
MemberCreateRequest upperCaseRequest =
new MemberCreateRequest("username", "password!");
MemberCreateRequest notEnglishRequest =
new MemberCreateRequest("username", "password한글");
//when
Set<ConstraintViolation<MemberCreateRequest>> upperCase =
validator.validateProperty(upperCaseRequest, "password");
Set<ConstraintViolation<MemberCreateRequest>> notEnglish =
validator.validateProperty(notEnglishRequest, "password");
//then
assertThat(upperCase.size()).isGreaterThan(0);
assertThat(notEnglish.size()).isGreaterThan(0);
}
}
}
반응형
'Tool > Spring' 카테고리의 다른 글
[Spring boot] controller layer 테스트 코드 작성하기 (0) | 2023.12.04 |
---|---|
[Spring boot] Service layer 테스트 코드 작성하기 (0) | 2023.12.04 |
[Spring boot] H2 데이터베이스에서 MySQL dialect 설정하기 (0) | 2023.12.01 |
[Spring boot] JUnit5 테스트 코드 작성하기 (0) | 2023.12.01 |
[Spring, DB] @ManyToMany를 지양하는 이유 (2) | 2023.11.24 |