[스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술] 12강
https://inf.run/hisy 강의를 수강하고 작성하는 게시물입니다.
1. 테스트 단축키
이전 테스트에서는
test폴더에 패키지를 만들고 해서 했었지만 간단하게 하는 방법이 있다.
클래스에 커서를 두고 cmd+ shift+ t 누르면 create new test 가 뜬다
라이브러리는 JUnit5를 선택하고
테스트를 진행할 메서드를 선택하고 ok를 누르면 넘어간다.
모두 선택하고 넘어간다.
자동으로 테스트코드 템플릿이 작성된것을 확인할 수 있다.
*참고 테스트는 실제코드에 포함되지 않으므로 함수명을 한글로 막적어도 상관없다.
1.1. 테스트 작성 tip
테스트는 보통 3가지 단계로 구분할 수 있다.
given / when / then
세가지 분류 주석을 적고 시작하면 편리하다.
2. join 테스트
MemberService memberService = new MemberService();
@Test
void join() {
//given
Member member = new Member();
member.setName("hello");
//when
Long saveId = memberService.join(member);
//then
Member findMember = memberService.findOne(saveId).get();
assertThat(member.getName()).isEqualTo(findMember.getName());
}
assertThat.isEqualTo는 static import 해서 사용했다.(option+enter 사용 : 10강 참고)
2.1. 예외처리 검증
회원가입 서비스는 잘 저장되는지도 중요하지만 중복 이름을 제거하는 것이 어찌보면 더 중요할 수 있다.
예외 부분을 테스트하는 검증메서드를 만들어보자.
@Test
void 중복_회원_예외() {
//given
Member member1 = new Member();
member1.setName("spring");
Member member2 = new Member();
member2.setName("spring");
//when
memberService.join(member1);
try {
memberService.join(member2);
fail();
} catch (IllegalStateException e) {
assertThat(e.getMessage()).isEqualTo("already exist.");
}
}
try catch 넣으면 코드가 깔끔해 보이지 않는다. 방법을 수정하여 아래와 같이도 쓸 수 있다.
@Test
void 중복_회원_예외() {
//given
Member member1 = new Member();
member1.setName("spring");
Member member2 = new Member();
member2.setName("spring");
//when
memberService.join(member1);
assertThrows(IllegalStateException.class, () -> memberService.join(member2));
}
메시지를 반환받아 확인할 수도 있다. (cmd + option + v)
@Test
void 중복_회원_예외() {
//given
Member member1 = new Member();
member1.setName("spring");
Member member2 = new Member();
member2.setName("spring");
//when
memberService.join(member1);
IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));
assertThat(e.getMessage()).isEqualTo("already exist.");
}
2.2. 테스트 사이 clear 해주기
현재 member간 이름이 달라서 저장됐지만 다음 테스트에서 동일한 이름을 쓰면 오류가 나므로 clear 해줘야한다.
10강에서 해준것 처럼 해준다.
MemoryMemberRepository memberRepository = new MemoryMemberRepository();
@AfterEach
public void afterEach() {
memberRepository.clearStore();
}
위의 문장을 추가해준다.(10강 참고)
ctrl + r 누르면 이전에 run했던것을 그대로 run 해준다.
2.3. 인스턴스 관리
MemoryMemberRepository() 는 MemberService에서 new로 생성을 했는데 MemberServiceTest 에서 다시 new를 이용해서 생성을 해줬다.
즉 2개를 갖고있는 것인데 테스트진행할때도 원래 갖고있던 인스턴스(리파지토리)로 테스트 하는게 옳다. (다른 db가 될 수 있다.)
같은 인스턴스(리파지토리)를 사용하도록 바꿔야 한다.
MemberService 클래스로 이동하여 new를 삭제하고 아래와 같이 바꿔준다.
cmd + N 을 눌러 constructor 팝업을 띄운다
MemberRepository를 선택하여 내부에서 직접 생성하는게 아닌 외부에서 넣어주게 바꿔준다.
// MemberService.java
public class MemberService {
private final MemberRepository memberRepository;
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
test에서도 외부에서 넣어주게 바꿔준다.
new를 지우고 @BeforeEach를 이용하여 테스트 시작전에 넣어준다.
// MemberServiceTest.java
class MemberServiceTest {
MemberService memberService;
MemoryMemberRepository memberRepository;
@BeforeEach
public void beforeEach() {
memberRepository = new MemoryMemberRepository();
memberService = new MemberService(memberRepository);
}
댓글 남기기