토이 프로젝트 스터디 #9

appti·2022년 6월 16일
0

토이 프로젝트 스터디 #9

  • 스터디 진행 날짜 : 6/16
  • 스터디 작업 날짜 : 6/14 ~ 6/16

토이 프로젝트 진행 사항

  • messageSource 테스트 코드 작성

내용

학습용 테스트 코드

  • 이해를 위해 messageSource 관련 학습용 테스트 코드 작성
@DisplayName("SignInValidation 테스트")
@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
class SignInValidationTest {

    Validator validator;

    @BeforeEach
    void beforeEach() {
        ResourceBundleMessageSource validatorMessageSource = new ResourceBundleMessageSource();
        validatorMessageSource.setBasenames("message/validation_message");
        validatorMessageSource.setDefaultEncoding("UTF-8");

        ResourceBundleMessageInterpolator messageInterpolator = new ResourceBundleMessageInterpolator(new MessageSourceResourceBundleLocator(validatorMessageSource));
        validator = Validation.byDefaultProvider().configure().messageInterpolator(messageInterpolator).buildValidatorFactory().getValidator();
    }

    @Test
    void signIn_검증_성공_테스트() {
        // given
        SignIn signIn = SignFactory.createSignIn("test@email.com");

        // when
        Set<ConstraintViolation<SignIn>> validate = validator.validate(signIn);

        // then
        assertTrue(validate.isEmpty());
    }

    @Test
    void email_email_검증_실패_테스트() {
        // given
        SignIn signIn = SignFactory.createSignIn("no-email-format");

        // when
        ConstraintViolation<SignIn> result = validator.validate(signIn).iterator().next();

        // then
        assertEquals("email", result.getPropertyPath().toString());
        assertEquals("이메일 형식으로 입력해주세요.", result.getMessage());
    }

    @ParameterizedTest
    @CsvSource(
            value = {
                    ":",
                    "'':"
            },
            delimiter = ':'
    )
    void email_blank_검증_실패_테스트(String email) {
        // given
        SignIn signIn = SignFactory.createSignIn(email);

        // when
        ConstraintViolation<SignIn> result = validator.validate(signIn).iterator().next();

        // then
        assertEquals("email", result.getPropertyPath().toString());
        assertEquals("이메일을 입력해주세요.", result.getMessage());
    }

    @ParameterizedTest
    @CsvSource(
            value = {
                    "test@email.com:",
                    "test@email.com:''"
            },
            delimiter = ':'
    )
    void password_null_검증_실패_테스트(String email, String password) {
        // given
        SignIn signIn = SignFactory.createSignInWithPassword(email, password);

        // when
        ConstraintViolation<SignIn> result = validator.validate(signIn).iterator().next();

        // then
        assertEquals("password", result.getPropertyPath().toString());
        assertEquals("비밀번호를 입력해주세요.", result.getMessage());
    }
}
  • SignIn 관련 검증 테스트 작성
    • 유사한 테스트를 처리하기 위해 @ParameterizedTest@CsvSource 사용

AccountController 테스트 코드 작성

@ExtendWith(MockitoExtension.class)
@DisplayName("AccountControllerAdvice 테스트")
@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
public class AccountControllerAdviceTest {

    @Mock
    AccountService accountService;

    @Mock
    LoginAccountArgumentResolver loginAccountArgumentResolver;

    @InjectMocks
    AccountController accountController;

    MockMvc mockMvc;
    ObjectMapper objectMapper = new ObjectMapper();

    @BeforeEach
    void beforeEach() {
        ResourceBundleMessageSource responseHandlerMessageSource = new ResourceBundleMessageSource();
        responseHandlerMessageSource.setBasenames("message/exception_code", "message/exception_message");
        responseHandlerMessageSource.setDefaultEncoding("UTF-8");

        ResourceBundleMessageSource validatorMessageSource = new ResourceBundleMessageSource();
        validatorMessageSource.setBasenames("message/validation_message");
        validatorMessageSource.setDefaultEncoding("UTF-8");

        LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean();
        validator.setValidationMessageSource(validatorMessageSource);

        mockMvc = MockMvcBuilders
                .standaloneSetup(accountController)
                .setControllerAdvice(
                        new AccountRestControllerAdvice(new ControllerAdviceUtils(responseHandlerMessageSource)),
                        new CommonRestControllerAdvice(new ControllerAdviceUtils(responseHandlerMessageSource)))
                .setValidator(validator)
                .setCustomArgumentResolvers(loginAccountArgumentResolver)
                .addFilter(new CharacterEncodingFilter("UTF-8", true))
                .alwaysDo(print())
                .build();
    }
    
    ...
}
  • 컨트롤러 테스트 작성 시 messageSource, argumentResolver, controllerAdvice, validator, filter 적용
    • 각종 예외에 대한 ControllerAdvice가 정상 동작하는지 테스트 코드로 확인 가능
profile
안녕하세요

0개의 댓글