
이번 포스팅에서는 MemoryMemberRepository 클래스의 기능을 검증하는 JUnit 테스트 클래스를 자세히 살펴보겠습니다. 이 코드는 회원 정보를 메모리에 저장하고, 저장된 정보를 조회하는 기능을 가지고 있습니다. 이를 테스트하기 위해 save, findByName, findAll 메서드를 검증하고, 테스트 간의 데이터 간섭을 방지하기 위한 방법을 소개하겠습니다.
package hello.hello_spring.repository;
import hello.hello_spring.domain.Member;
import org.assertj.core.api.Assertions;
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() {
repository.clearStore();
}
@Test
public void save() {
Member member = new Member();
member.setName("spring");
repository.save(member);
Member result = repository.findById(member.getId()).get();
assertThat(member).isEqualTo(result);
}
@Test
public void findByName() {
Member member1 = new Member();
member1.setName("spring1");
repository.save(member1);
Member member2 = new Member();
member2.setName("spring2");
repository.save(member2);
Member result = repository.findByName("spring1").get();
assertThat(result).isEqualTo(member1);
}
@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);
}
}
먼저, MemoryMemberRepository의 인스턴스를 생성합니다. 이 인스턴스를 통해 회원 정보를 저장하고 조회하는 기능을 테스트할 것입니다.
MemoryMemberRepository repository = new MemoryMemberRepository();
@AfterEach 어노테이션은 각 테스트 메서드가 실행된 후에 실행되는 메서드를 정의할 때 사용합니다. 여기서는 afterEach 메서드를 통해 테스트가 끝날 때마다 저장소를 초기화합니다. 이렇게 하면 각 테스트가 독립적으로 실행되며, 이전 테스트의 데이터가 이후 테스트에 영향을 주지 않게 됩니다.
@AfterEach
public void afterEach() {
repository.clearStore();
}
save 메서드는 회원 정보를 저장하는 기능을 검증합니다. 회원 객체를 생성하고 저장한 후, 저장된 객체를 다시 조회하여 같은 객체인지 확인합니다.
@Test
public void save() {
Member member = new Member();
member.setName("spring");
repository.save(member);
Member result = repository.findById(member.getId()).get();
assertThat(member).isEqualTo(result);
}
Member 객체를 생성하고 이름을 "spring"으로 설정합니다.repository.save(member)를 호출하여 회원 정보를 저장합니다.result에 저장합니다.assertThat(member).isEqualTo(result)를 사용하여 저장한 회원 객체와 조회한 회원 객체가 동일한지 검증합니다.findByName 메서드는 이름으로 회원을 찾는 기능을 검증합니다. 두 개의 회원 객체를 저장한 후, 이름으로 회원을 조회하여 올바른 회원 객체가 반환되는지 확인합니다.
@Test
public void findByName() {
Member member1 = new Member();
member1.setName("spring1");
repository.save(member1);
Member member2 = new Member();
member2.setName("spring2");
repository.save(member2);
Member result = repository.findByName("spring1").get();
assertThat(result).isEqualTo(member1);
}
Member 객체를 생성하고 이름을 "spring1"으로 설정합니다.repository.save(member1)를 호출하여 첫 번째 회원 정보를 저장합니다.Member 객체를 생성하고 이름을 "spring2"로 설정합니다.repository.save(member2)를 호출하여 두 번째 회원 정보를 저장합니다.repository.findByName("spring1").get()을 호출하여 이름이 "spring1"인 회원을 조회합니다.assertThat(result).isEqualTo(member1)를 사용하여 조회한 회원 객체가 첫 번째 회원 객체와 동일한지 검증합니다.findAll 메서드는 저장된 모든 회원 정보를 조회하는 기능을 검증합니다. 두 개의 회원 객체를 저장한 후, 모든 회원을 조회하여 저장된 회원의 수가 올바른지 확인합니다.
@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);
}
Member 객체를 생성하고 이름을 "spring1"으로 설정합니다.repository.save(member1)를 호출하여 첫 번째 회원 정보를 저장합니다.Member 객체를 생성하고 이름을 "spring2"로 설정합니다.repository.save(member2)를 호출하여 두 번째 회원 정보를 저장합니다.repository.findAll()을 호출하여 모든 회원 정보를 조회하고, 결과를 result에 저장합니다.assertThat(result.size()).isEqualTo(2)를 사용하여 저장된 회원의 수가 2와 동일한지 검증합니다.이 포스팅에서는 MemoryMemberRepository 클래스의 주요 기능을 테스트하는 JUnit 테스트 코드를 자세히 살펴보았습니다. 각 테스트 메서드는 독립적으로 실행되며, 테스트 간 데이터 간섭을 방지하기 위해 @AfterEach 메서드를 사용하여 저장소를 초기화했습니다. 이를 통해 save, findByName, findAll 메서드의 동작을 검증하고, 코드가 의도한 대로 작동하는지 확인할 수 있습니다.
이와 같은 방법으로 테스트 코드를 작성하면, 애플리케이션의 기능을 지속적으로 검증할 수 있으며, 코드 변경 시 발생할 수 있는 버그를 조기에 발견할 수 있습니다. 따라서 테스트 코드를 잘 작성하고 유지보수하는 것은 매우 중요합니다.