코드의 안전성고 유지보수를 위해서 필수적이다. 스프링처럼 비즈니스 로직이 많고 복잡한 프로젝트에서는 필수로 작성해야 한다.

코드 변경이 있어도 기존 기능이 정상동작하는지 확인 가능

코드 품질 향상

리팩토링이 쉬워짐

package hello.hellospring.repository;

import hello.hellospring.domain.Member;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;

import java.util.List;

import static org.assertj.core.api.Assertions.*;

class MemoryMemberRepositoryTest {
    MemoryMemberRepository repository = new MemoryMemberRepository();

    @AfterEach
    public void afterEach() {
        repository.clearStore();
    }

    @Test
    public void save() {
        Member member1 = new Member();
        member1.setName("Sprinig1");

        repository.save(member1);

        Member result = repository.findById(member1.getId()).get();
        assertThat(member1).isEqualTo(result);
    }

    @Test
    public void findByName() {
        Member member1 = new Member();
        member1.setName("Sprinig1");
        repository.save(member1);

        Member member2 = new Member();
        member2.setName("Sprinig2");
        repository.save(member2);

        Member result = repository.findByName("Sprinig1").get();
        assertThat(result).isEqualTo(member1);
    }

    @Test
    public void findAll() {
        Member member1 = new Member();
        member1.setName("Sprinig1");
        repository.save(member1);

        Member member2 = new Member();
        member2.setName("Sprinig2");
        repository.save(member2);

        List<Member> result = repository.findAll();

        assertThat(result.size()).isEqualTo(2);
    }

}

테스트코드는 순서에 의존하지 않게 만들어야 한다.

위 예제에서 AfterEach로 매 테스트마다 초기화해주지 않으면 문제가 발생할 수 있다. 테스트코드는 절대 순서에 의존하게 만들면 안된다.

TDD(테스트주도개발)

실제 코딩을 하기 전에 테스트를 먼저 만들고 클래스를 만들어서 돌려본다.