본문 바로가기
개발/Spring

[스프링 입문] 스프링 회원관리 예제 - 3. 회원 레포지토리 테스트 케이스 작성

by ujin2021 2021. 6. 29.

* 인프런 김영한님의 '스프링 입문' 강의를 듣고 작성한 내용입니다! (https://inf.run/txXC)

 

프로젝트를 실행시켜서 테스트 해볼 수 있지만, 준비하고 실행하는데 시간이 오래걸린다. 따라서 JUnit framework를 사용해 테스트를 한다

회원 레포지토리 테스트 케이스 작성

1. src/test/java/hello.hellospring/repository (package 생성)

2. repository/MemoryMemberRepositoryTest (java 파일 생성)

[MemoryMemberRepositoryTest.java 소스코드]

package hello.hellospring.repository;
import hello.hellospring.domain.Member;
import org.assertj.core.api.Assertions; // alt + enter 쳐서 static import 해준다
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
import java.util.List;
import java.util.Optional;
import static org.assertj.core.api.Assertions.*;
public class MemoryMemberRepositoryTest {
MemoryMemberRepository repository = new MemoryMemberRepository();
@AfterEach
public void afterEach() { // test function이 끝나고 호출되는 함수
repository.clearStore(); // MemoryMemberRepository 에 clearStore 함수를 만들어준다
}
@Test
public void save() {
Member member = new Member();
member.setName("spring");
repository.save(member);
Member result = repository.findById(member.getId()).get(); // optional type에서 data꺼낼 때 .get() 사용
// Assertions.assertEquals(result, member); // (expected, result) - org.junit.jupyter
assertThat(member).isEqualTo(result); // 초록불 뜨면 true - org.assertj (이걸 더 많이 쓴다)
// assertThat(member).isEqualTo(null); // 빨간불 - false
}
@Test
public void findByName() {
// member1이 가입
Member member1 = new Member();
member1.setName("spring1");
repository.save(member1);
// member2가 가입
Member member2 = new Member();
member2.setName("spring2");
repository.save(member2);
Member result = repository.findByName("spring1").get();
assertThat(result).isEqualTo(member1); // true
// assertThat(result).isEqualTo(member2); // false
}
@Test
public void findAll() {
Member member1 = new Member();
member1.setName("spring1");
repository.save(member1);
Member member2 = new Member();
member2.setName("spring2");
repository.save(member2);
List<Member> result = repository.findAll();
assertThat(result.size()).isEqualTo(2);
}
}
  • 각 method에 @Test annotation을 붙여준다
  • 보통 Test file 생성할 때 원래 class 명 + Test 로 생성한다
  • given : 어떤게 주어졌을 때 / when : 이것을 실행했을 때 / then : 이게 나와야 한다 (김영한 님이 주로 사용하는 방법)
  • 각각의 method옆의 초록색 run 버튼으로 함수하나씩 실행할 수 있고, class전체를 실행할 수 있다
  • Class 전체를 실행시키면, method 순서 상관없이 실행된다 => Test는 순서에 의존하지 않고 실행되어야 한다(독립적으로)
  • 하나의 테스트 실행 후에 DB를 지워준 다음에 그다음 테스트를 진행해야 한다 => @AfterEach annotation을 사용해 하나의 테스트 후에(after) 실행해야 할 것을 적어준다 (clearStore())