토이 프로젝트 스터디 #9
- 스터디 진행 날짜 : 6/16
- 스터디 작업 날짜 : 6/14 ~ 6/16
토이 프로젝트 진행 사항
내용
학습용 테스트 코드
- 이해를 위해
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_검증_성공_테스트() {
SignIn signIn = SignFactory.createSignIn("test@email.com");
Set<ConstraintViolation<SignIn>> validate = validator.validate(signIn);
assertTrue(validate.isEmpty());
}
@Test
void email_email_검증_실패_테스트() {
SignIn signIn = SignFactory.createSignIn("no-email-format");
ConstraintViolation<SignIn> result = validator.validate(signIn).iterator().next();
assertEquals("email", result.getPropertyPath().toString());
assertEquals("이메일 형식으로 입력해주세요.", result.getMessage());
}
@ParameterizedTest
@CsvSource(
value = {
":",
"'':"
},
delimiter = ':'
)
void email_blank_검증_실패_테스트(String email) {
SignIn signIn = SignFactory.createSignIn(email);
ConstraintViolation<SignIn> result = validator.validate(signIn).iterator().next();
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) {
SignIn signIn = SignFactory.createSignInWithPassword(email, password);
ConstraintViolation<SignIn> result = validator.validate(signIn).iterator().next();
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
가 정상 동작하는지 테스트 코드로 확인 가능