기존 코드
package com.ptjcoding.nbcampspringnewsfeed.domain.member.dto;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern;
import lombok.Getter;
@Getter
public class LoginRequestDto {
@NotBlank
@Pattern(regexp = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$")
private String email;
@NotBlank
@Pattern(regexp = "^(?!.+ ).+$")
@Pattern(regexp = "^(?=.*\\d).+$")
@Pattern(regexp = "^(?=.*[a-z]).+$")
@Pattern(regexp = "^(?=.*[A-Z]).+$")
private String password;
}
테스트코드 작성을 위한 테스트 코드
package com.ptjcoding.nbcampspringnewsfeed.domain.member.dto;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@AllArgsConstructor
public class LoginRequestDto {
@NotBlank
@Pattern(regexp = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$")
private String email;
@NotBlank
@Pattern(regexp = "^(?!.+ ).+$")
@Pattern(regexp = "^(?=.*\\d).+$")
@Pattern(regexp = "^(?=.*[a-z]).+$")
@Pattern(regexp = "^(?=.*[A-Z]).+$")
private String password;
}
RequsetDto는 Setter와 AllArgsConstructor와 같은 매서드가 불필요한 코드이다.
- RequestDto의 값은 클라이언트로부터 값을 입력 받아 ObjectMapper를 통해 자동으로 객체로 변환 되기 때문이다. 그렇기 때문에 테스트 코드를 위한 Setter와 생성자가 추가 되었을 경우, 추가로 인한 버그를 발생 시킬 수 있기 때문이다.
해결 방법
@Test
@DisplayName("이메일 검증")
void 이메일_검증() {
LoginRequestDto loginRequestDto = new LoginRequestDto();
ReflectionTestUtils.setField(loginRequestDto, "email", "email@email.com");
ReflectionTestUtils.setField(loginRequestDto, "password", "password");
Set<ConstraintViolation<LoginRequestDto>> violations = validator.validate(loginRequestDto);
for (ConstraintViolation<LoginRequestDto> violation : violations) {
System.out.println("메세지 : " + violation.getMessage());
}
assertEquals(2, violations.size());
}
ReflectionTestUtils을 이용하여 객체에 값을 할당한다.