Junit5 를 사용하는 service 를 테스트 해보자!
< 패스워드 변경을 성공하는 테스트를 만들 예정이다 >
참고로 난 스프링 3.0, JAVA 17을 사용중이므로
junit5 를 사용 중이다 !
스프링부트 3.0 을 사용하면 junit5 가 자동으로 의존성 추가되고
junit5 를 사용하면 요런 애들이 같이 들어간다
그럼 코드를 찬찬히 살펴본다 !
package today.also.hyuil.service.member;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import today.also.hyuil.domain.member.*;
import today.also.hyuil.exception.MemberNotFoundException;
import today.also.hyuil.exception.NotValidException;
import today.also.hyuil.repository.member.MemberJpaRepository;
import today.also.hyuil.service.member.inter.MemberJoinService;
import java.util.Date;
import static org.assertj.core.api.Assertions.assertThat;
// module 이 여러개여서 인텔리제이가 오류를 띄움
@SpringBootTest
class MemberJoinServiceImplTest {
@Autowired
private MemberJoinService memberJoinService;
@Autowired
private MemberJpaRepository memberJpaRepository;
@BeforeEach
void clean() {
memberJpaRepository.deleteAll();
}
// 패스워드 업데이트
@Test
@DisplayName("패스워드 변경시 성공처리")
void pw_update_success() throws NotValidException, MemberNotFoundException {
// given -> Nullable 한 컬럼은 굳이,,,
Member member = getMember();
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);
}
private Member getMember() {
Address address = new Address();
Member member = Member.builder()
.memberId("memberId")
.password("password!123")
.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;
}
}
@SpringBootTest
class MemberJoinServiceImplTest {
@Autowired
private MemberJoinService memberJoinService;
@Autowired
private MemberJpaRepository memberJpaRepository;
테스트 클래스 위에 @SpringBootTest 애노테이션을 붙여주고
내가 사용할 클래스들에 의존성 자동 주입을 해준다
일단 Junit4 를 사용했던 때와 다르게 Junit5 부터는 @springBootTest 만 써도 테스트가 가능하다
스프링 부트 3.1 도큐먼트에서 보면 Junit5 를 사용하는 사람들은 @SpringBootTest 만 사용하면 test 를 실행할 수 있기 때문이다!!
@BeforeEach
void clean() {
memberJpaRepository.deleteAll();
}
그리고 @BeforeEach 를 사용해서 새로운 테스트가 실행되기 전
모든 데이터를 삭제해주는 로직을 실행시킨다.
그러면 깨끗해진 DB에서 안전한 테스트를 할 수 있겠죠? ^_^
참고로 Junit5 에서 사용할 수 있는 테스트용 애노테이션은 여러가지가 있는데
이건 간단하게 모든 테스트 메서드 실행 전에 실행되어야 할 메서드라고 정해주는 애노테이션임 ! !
그러면 테스트를 한번 작성해보쟈 ~~^___^
@Test
@DisplayName("패스워드 변경시 성공처리")
void pw_update_success() throws NotValidException, MemberNotFoundException {
// given -> Nullable 한 컬럼은 굳이,,,
Member member = getMember();
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 메서드는 머냐면
테스트 메서드 위에 작성하는 애노테이션으로
쉽게 말해 이게 어떤 테스트인지 설명해주는, 테스트 이름을 정하는 애노테이션이다
최대한 자세히 적어주는 것이 좋다고 한다~
그리고 테스트 메서드는 언더바( _ ) 사용이 가능하기 때문에 _ 를 붙여서 더 쉽게 알아볼 수 있도록 써준다,
// given
Member member = getMember();
member = memberJoinService.joinMember(member);
일단 테스트는 given -> when -> then 순서로 작성한다
내가 테스트할 때 바탕이 되어야하는 상황을 만들고 -> 테스트 로직이 실행되고 -> 이 결과가 어떻게 되는지 ! !
나는 일단 가입 된 멤버가 있어야 패스워드를 변경할 수 있으니 멤버를 가입 시킨다 ^___^
// when -> Pw change
String newPwd = "Pwd123SSdsa";
memberJoinService.passwordChange(member.getId(), "password!123", newPwd);
Member findMember = memberJpaRepository.findById(member.getId()).orElse(null);
진짜 패스워드 로직을 실행시킨다.
memberJoinService에 있는 passwordChange() 로직을 실행시킨다
그리고 잘 변경 되었는지 멤버 id 를 이용해 DB 에 저장되어 있는 멤버를 가져온다
저 가운데에 들어가는 "password!123" 은 회원가입 된 멤버의 원래 패스워드다.
private Member getMember() {
Address address = new Address();
Member member = Member.builder()
.memberId("memberId")
.password("password!123")
.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;
}
// then -> Assertion
assertThat(findMember).isNotNull();
assertThat(findMember.getPassword()).isEqualTo(newPwd);
그리고 Assertions.assertThat() 메서드로 검증한다.
일단 가져온 멤버가 널이 아닌지(제대로 가입되어 있는지) 확인 후
가져온 멤버의 패스워드가 newPwd 와 일치하는지 확인한다.
그러면 결과는?
예쁜 초록색이 뜨며 성공적으로 passed 된 것을 볼 수 있다 ^____^ 야호 !
'개발공부 개발새발 > JAVA' 카테고리의 다른 글
JAVA ) GC & JVM (0) | 2023.07.21 |
---|---|
Junit5 Test ) Controller 를 테스트 해보자! (0) | 2023.07.01 |
JpaRepository 를 사용하는 클래스를 테스트를 하고 싶어요! (0) | 2023.05.31 |
Dto를 파라미터로 받았을 때, 엔티티는 어느 계층에서 변환해야 좋을까? +) 바뀐 의견 추가 (0) | 2023.05.06 |
QueryDsl 의존성(Gradle) 세팅 (0) | 2023.03.11 |