[Spring Boot] Test Case 만들기

DU·2024년 7월 16일

Spring Boot

목록 보기
2/4
post-thumbnail

MemoryMemberRepository 테스트 코드 자세히 설명하기

이번 포스팅에서는 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의 인스턴스를 생성합니다. 이 인스턴스를 통해 회원 정보를 저장하고 조회하는 기능을 테스트할 것입니다.

MemoryMemberRepository repository = new MemoryMemberRepository();

@AfterEach 메서드

@AfterEach 어노테이션은 각 테스트 메서드가 실행된 후에 실행되는 메서드를 정의할 때 사용합니다. 여기서는 afterEach 메서드를 통해 테스트가 끝날 때마다 저장소를 초기화합니다. 이렇게 하면 각 테스트가 독립적으로 실행되며, 이전 테스트의 데이터가 이후 테스트에 영향을 주지 않게 됩니다.

@AfterEach
public void afterEach() {
    repository.clearStore();
}
  • 왜 AfterEach를 사용하는가?
    • JUnit은 테스트 메서드의 실행 순서를 보장하지 않습니다. 따라서 테스트 메서드 간의 데이터 간섭을 방지하기 위해 각 테스트 후 저장소를 초기화하는 것이 중요합니다. 이렇게 하면 각 테스트가 독립적으로 실행되어 테스트 결과에 영향을 미치지 않습니다.

save 메서드 테스트

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)를 호출하여 회원 정보를 저장합니다.
    • 저장된 회원을 ID로 조회하여 result에 저장합니다.
    • assertThat(member).isEqualTo(result)를 사용하여 저장한 회원 객체와 조회한 회원 객체가 동일한지 검증합니다.

findByName 메서드 테스트

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 메서드 테스트

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 메서드의 동작을 검증하고, 코드가 의도한 대로 작동하는지 확인할 수 있습니다.

이와 같은 방법으로 테스트 코드를 작성하면, 애플리케이션의 기능을 지속적으로 검증할 수 있으며, 코드 변경 시 발생할 수 있는 버그를 조기에 발견할 수 있습니다. 따라서 테스트 코드를 잘 작성하고 유지보수하는 것은 매우 중요합니다.

0개의 댓글