Spring/스프링 입문 - 스프링 부트, 웹 MVC, DB 접근 기술

7. 회원 도메인과 리포지토리 생성 | 테스트 케이스 작성

DEV-HJ 2023. 3. 5. 17:30
반응형

domain

package hello.hellospring.domain;

public class Member {
    private Long id;
    private String name;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

repository

package hello.hellospring.repository;

import hello.hellospring.domain.Member;

import java.util.List;
import java.util.Optional;

public interface MemberRepository {

    Member save(Member member); //회원을 저장하면 저장된 회원이 반환

    //Optional은 java8에 들어간 기능 null을 그대로 반환하지 않고 감싸서 반환
    Optional<Member> findById (Long id);
    Optional<Member> findByName (String name);
    List<Member> findAll();

}

repository 구현체

package hello.hellospring.repository;

import hello.hellospring.domain.Member;
import org.springframework.stereotype.Repository;

import java.util.*;


public class MemoryMemberRepository implements MemberRepository{ //implements는 인터페이스 상속에 사용

    private static Map<Long, Member> store = new HashMap<>();
    private static long sequence = 0L;

    @Override
    public Member save(Member member) {
        member.setId(++sequence);
        store.put(member.getId(),member);
        return member;
    }

    @Override
    public Optional<Member> findById(Long id) {
        return Optional.ofNullable(store.get(id));
    }

    @Override
    public Optional<Member> findByName(String name) {
        return store.values().stream()
                .filter(member -> member.getName().equals(name))
                .findAny();
    }

    @Override
    public List<Member> findAll() {
        return new ArrayList<>(store.values());
    }

    public void claerStore(){
        store.clear();
    }

}

테스트 케이스 (코드를 코드로 검증하기)

개발한 기능을 실행해서 테스트 할 때 자바의 main메서드를 통해서 실행하거나

웹 애플리케이션의 컨트롤러를 통해서 해당 기능을 실행한다.

이러한 방법은 준비하고 실행하는데 오래 걸리고, 반복 실행하기 어렵고 여러 테스트를 한번에

실행하기 어렵다는 단점이 있다. 

자바는 Junit이라는 프레임워크로 테스트틀 실행해서 이러한 문제를 해결한다.

 

회원 리포지토리 메모리 구현체 테스트

src/test/java 하위 폴더에 생성한다

 

테스트는 서로 순서 관계없이, 의존관계 없이 설계 되어야한다.

테스트가 끝날때마다 저장소를 지운다 (@AfterEach 사용). 그러면 순서가 상관이 없어진다.
하나의 테스트가 끝나면 공용데이터를 깔끔하게 지워줘야 다음 테스트시 문제가없다.

 

테스트 코드 없이 개발하는건 나 혼자 개발할땐 문제가 없지만 여러 사람이 개발할때 문제가 생긴다.

소스 코드 베이스가 몇 만 라인이 넘어가기 시작하면 테스트코드 없이 개발할 시 문제가 많이 생긴다.

테스트 코드 관련해서 깊이있게 공부하는걸 추천

package hello.hellospring.ropository;

import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;

import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
import org.assertj.core.api.Assertions;
import static org.assertj.core.api.Assertions.*; // Assertions생략 가능해짐

import java.util.List;
import java.util.Optional;

public class MemoryMemberRepositoryTest {

    MemoryMemberRepository repository = new MemoryMemberRepository();


// @AfterEach → 메서드가 실행이 끝날때마다 실행되는 메서드
    @AfterEach
    public void atterEach(){       
        repository.claerStore();
    }


    @Test
    public void save(){
        Member member = new Member();
        member.setName("임현정");

        repository.save(member);
        Member result = repository.findById(member.getId()).get();
        // 검증방법1
        //System.out.println("result = "+(result == member));

        // 검증방법2 - Assertions : Junit이 제공하는 기능 값이 똑같은지 확인해준다
        //Assertions.assertEquals(member, result);

        // 검증방법3 
        assertThat(member).isEqualTo(result);

    };

    @Test
    public void findByName(){
        Member member1 = new Member();
        member1.setName("스프링1");
        repository.save(member1);

        Member member2 = new Member();
        member2.setName("스프링2");
        repository.save(member2);

        Member result = repository.findByName("스프링1").get();

        // result는 member1와 같은지 검사
        assertThat(result).isEqualTo(member1);

    }

    @Test
    public void findAll(){
        Member member1 = new Member();
        member1.setName("스프링1");
        repository.save(member1);

        Member member2 = new Member();
        member2.setName("스프링2");
        repository.save(member2);

        Member member3 = new Member();
        member3.setName("스프링3");
        repository.save(member3);

        List<Member> result = repository.findAll();
        assertThat(result.size()).isEqualTo(3);
    }
}

반응형