본문 바로가기

TIL (Today I learned

2024/02/19 단위 테스트를 위한 기존 코드 수정은 올바른가?

기존 코드

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을 이용하여 객체에 값을 할당한다.