자세한 테스트 방법은
Junit5 Test ) Service 를 테스트 해보자!
Junit5 를 사용하는 service 를 테스트 해보자! < 패스워드 변경을 성공하는 테스트를 만들 예정이다 > 참고로 난 스프링 3.0, JAVA 17을 사용중이므로 junit5 를 사용 중이다 ! 스프링부트 3.0 을 사용하면
hyuil.tistory.com
Junit5 Test ) Controller 를 테스트 해보자!
이번엔 Controller 를 테스트 해보겠다 Controller 는 HttpServletRequest 도 사용하고 값도 원래는 프론트에서 넣어줘야하는데 어떻게~~~할까용? @SpringBootTest @AutoConfigureMockMvc class MemberInfoControllerTest { @Autowir
hyuil.tistory.com
에 나와있다
여기서는 간단하게 내가 어떤 테스트를 진행했는지만 작성하고
실제로 오류를 잡아낸 경험을 작성해보겠음 !
일단 내가 작성한 MemberJoinServiceImplTest
@SpringBootTest
class MemberJoinServiceImplTest {
@Autowired
private MemberJoinService memberJoinService;
@Autowired
private MemberJpaRepository memberJpaRepository;
private final String password = "password!123";
@BeforeEach
void clean() {
memberJpaRepository.deleteAll();
}
@Test
@DisplayName("가입 성공 처리")
void join() {
// given
Member member = getMember(password);
// when
Member findMember = memberJoinService.joinMember(member);
// then
assertThat(findMember).isNotNull();
assertThat(findMember.getMemberId()).isEqualTo(member.getMemberId());
}
@Test
@DisplayName("memberId 로 멤버를 가져올 때, role 도 가져오는지 검증")
void findMyAccountMemberId_get_role() {
// given
Member member = getMember(password);
member = memberJoinService.joinMember(member);
// when
Member findMember = memberJoinService.findMyAccountMemberId(member.getMemberId());
// then
assertThat(findMember.getRole()).isNotNull();
assertThat(findMember.getRole().getName()).isNotNull();
assertThat(findMember.getRole().getName()).isEqualTo(Name.ROLE_USER);
}
@Test
@DisplayName("id 로 멤버를 가져올 때, role 도 가져오는지 검증")
void findMyAccount_get_role() {
// given
Member member = getMember(password);
member = memberJoinService.joinMember(member);
// when
Member findMember = memberJoinService.findMyAccount(member.getId());
// then
assertThat(findMember.getRole()).isNotNull();
assertThat(findMember.getRole().getName()).isNotNull();
assertThat(findMember.getRole().getName()).isEqualTo(Name.ROLE_USER);
}
@Test
@DisplayName("멤버가 가입이 안 되어 있을 때, idPwdValid 를 실행하면 MemberNotFoundException 발생")
void id_pwd_valid_fail_memberNotFoundException() {
// given
Member member = getMember(password);
// expected
assertThrows(MemberNotFoundException.class,
() -> memberJoinService.idPwdValid(member.getMemberId(), member.getPassword()));
}
@Test
@DisplayName("아이디와 패스워드가 맞을 때 true 를 return 하는지 검증")
void id_pwd_valid_success() throws MemberNotFoundException {
// given
Member member = getMember(password);
member = memberJoinService.joinMember(member);
// when
boolean result = memberJoinService.idPwdValid(member.getMemberId(), password);
// then
assertThat(result).isTrue();
}
@Test
@DisplayName("아이디와 패스워드가 틀릴 때 false 를 return 하는지 검증")
void id_pwd_valid_fail() throws MemberNotFoundException {
// given
Member member = getMember(password);
member = memberJoinService.joinMember(member);
// when
boolean result = memberJoinService.idPwdValid(member.getMemberId(), password+"123");
// then
assertThat(result).isFalse();
}
@Test
@DisplayName("패스워드 변경시 성공 처리")
void pw_update_success() throws NotValidException, MemberNotFoundException {
// given -> Nullable 한 컬럼은 굳이,,,
Member member = getMember(password);
member = memberJoinService.joinMember(member);
// when -> Pw change
String newPwd = "Pwd123SSdsa";
memberJoinService.passwordChange(member.getId(), "password!123", newPwd);
Member findMember = memberJpaRepository.findById(member.getId()).orElse(null);
// then -> Assertion
assertThat(findMember).isNotNull();
assertThat(findMember.getPassword()).isEqualTo(newPwd);
}
@Test
@DisplayName("패스워드 변경시 실패 처리")
void pw_update_fail() throws NotValidException, MemberNotFoundException {
// given
Member member = getMember(password);
Member findMember = memberJoinService.joinMember(member);
// when -> Pw change
String newPwd = "Pwd123SSdsa";
// 가입한 것과 다른 패스워드 줌
// then -> Assertion
assertThrows(NotValidException.class, () ->
memberJoinService.passwordChange(findMember.getId(), "passwor2", newPwd));
}
private Member getMember(String password) {
Address address = new Address();
Member member = Member.builder()
.memberId("memberId")
.password(password)
.name("name")
.nickname("nickname")
.email("email@email.com")
.phone("01033332222")
.address(address)
.role(new Role(Name.ROLE_USER))
.joinDate(new Date())
.pwdModifyDate(new Date())
.sns(Sns.NONE)
.build();
return member;
}
}
나는 여러가지 테스트 케이스를 작성했는데
그 중 내가 오류를 잡았던 케이스는
@Test
@DisplayName("id 로 멤버를 가져올 때, role 도 가져오는지 검증")
void findMyAccount_get_role() {
// given
Member member = getMember(password);
member = memberJoinService.joinMember(member);
// when
Member findMember = memberJoinService.findMyAccount(member.getId());
// then
assertThat(findMember.getRole()).isNotNull();
assertThat(findMember.getRole().getName()).isNotNull();
assertThat(findMember.getRole().getName()).isEqualTo(Name.ROLE_USER);
}
이것이었다
아니? 이런 간단한 로직이 왜? 하겠지만
findMyAccount() 메서드를 확인해보면
@Override
public Member findMyAccount(Long id) {
return memberRepository.findByIdRole(id);
}
findByIdRole 메서드를 사용하고 있다
해당 메서드 안으로 들어가보자
public Member findByIdRole(Long id) {
Member member = em.find(Member.class, id);
member.getRole();
return member;
}
이 메서드는 내가 Member 안에 있는 Role 객체를
Poxy 객체가 아닌 진짜 객체로 가져오기 위해 작성했던 메서드다
그래서 member.getRole() 을 해줘서 role 을 같이 가져오려고 했던 건데
해당 테스트가 실패하고
세션이 없다는 메시지가 떴다
안이 비어있다는 뜻이겠죠?
아! 맞다
그 객체를 가져오려면
객체 안에 있는 데이터까지 가져와야 해당 객체가 불러와졌지 참!!!
public Member findByIdRole(Long id) {
Member member = em.find(Member.class, id);
member.getRole().getName();
return member;
}
메서드를 간단하게 수정했고
테스트가 성공하는 것을 볼 수 있다 ! 야호 ~
테스트를 해서 진짜 에러를 잡아내다니
겁내 신기하고 멋진 경험이었음ㅋㅋㅋㅋㅋㅋㅋㅋ캬캬
이래서 테스트를 하는 거구만!~~~
내게 테스트 케이스 작성 방법을 알려준 노란집 개발자님에게
감사하는 부분이구요ㅎ
(아직 답장 안 왓지만 쨌든;;)
기분굿 ㅎ
'프로젝트 > 토이 프로젝트) 오늘도 휴일' 카테고리의 다른 글
보안을 위해 닉네임 대신 id 검증으로 코드를 리팩토링 하자! (0) | 2023.06.22 |
---|---|
NullCheck 를 @Valid 로 손쉽게 ^__^ (0) | 2023.06.22 |
Spring Security ) Spring 3.0 에 맞춰 SecurityConfig 를 수정하자! (1) | 2023.06.14 |
좀 더 객체 지향에 걸맞게 메일 서비스를 수정해보자 ! (1) | 2023.06.13 |
토이 프로젝트 ) 휴일 팬사이트 "오늘도 휴일" : 사이트 소개 및 설명 (0) | 2023.05.26 |