[Spring Boot] 테스트 케이스 작성

이상협·2023년 1월 16일
0

Spring Boot

목록 보기
7/13

개발한 기능을 테스트 할 때 컨트롤러를 빌드해서 실행하여 테스트하기에는 시간이 너무 오래 걸리고, 반복 실행과 한번에 테스트하기 어렵다는 단점이 있다.

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

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

// src/test/java/com.example.hello_spring/repository/MemoryMemberRepositoryTest

import com.example.hello_spring.domain.Member;
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.Assertion.*;

public class MemoryMemberRepositoryTest {

    MemoryMemberRepository repository = new MemoryMemberRepository();

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

    @Test
    public void save() {
    	//given
        Member member = new Member();
        member.setName("spring");

		//when
        repository.save(member);

		//then
        Member result = repository.findById(member.getId()).get();
        assertEquals(member, result);
    }

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

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

		//when
        Member result = repository.findByName("spring1").get();

		//then
        assertEquals(member1, result);
    }

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

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

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

		//then
        assertEquals(2, result.size());
    }
}

@AfterEach: 한번에 여러 테스트를 실행하면 메모리 DB에 직전 테스트의 결과가 남을 수 있다. 이렇게 되면 제대로 된 테스트가 진행되지 않기 때문에 @AfterEach를 사용하여 각 테스트가 종료될 때 마다 실행한다.

🎈회원 서비스

회원 서비스 개발

// src/main/java/com.example.hello_spring/service/MemverService

public class MemberService {

	private final MemberRepository memberRepository = new MemoryMemberRepository();
    
    /***
     * 회원가입
     */
    public Long join(Member member) {
    	
        validateDuplicateMember(member); //중복 회원 검증
        memberRepository.save(member);
        return member.getId();
    }
    
    private void validateDuplicationMember(Member member) {
    	memberRepository.findByName(member.getName())
        		.ifPresent(m -> {
                	throw new IllegalStateException("이미 존재하는 회원입니다.);
                });
    }
    
    /**
     * 전체 회원 조회
     */
    public List<Member> findMembers() {
    	return memberRepository.findAll();
    }
    
    public Optional<Member> findOne(Long memberId) {
    	return memberRepository.findById(memberId);
    }
}

회원 서비스 테스트

MemberService에서 기존에는 회원 서비스가 메모리 회원 레포지토리를 직접 생성하게 했지만, 회원 서비스 코드를 DI(Dependency Injection)이 가능하도록 변경한다.

public class MemberService {

	private final MemberRepository memberRepository;
    
    public MemberService(MemberRepository memberRepository) {
    	this.memberRepository = memberRepository;
    }
    ...
}
// src/test/java/com.example.hello_spring/service/MemberServiceTest

class MemberServiceTest {

    MemberService memberService;
    MemoryMemberRepository memberRepository;

    @BeforeEach
    public void beforeEach() {
        memberRepository = new MemoryMemberRepository();
        memberService = new MemberService(memberRepository);
    }

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

    @Test
    void 회원가입() { // 한글로 바꿔도 됨
        // given
        Member member = new Member();
        member.setName("spring");

        // when
        Long saveId = memberService.join(member);

        // then
        Member findMember = memberService.findOne(saveId).get();
        Assertions.assertEquals(member.getName(), findMember.getName());
    }

    @Test
    public void 중복_회원_예외() {
        // given
        Member member1 = new Member();
        member1.setName("spring");

        Member member2 = new Member();
        member2.setName("spring");

        // when
        memberService.join(member1);
        IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));

        assertEquals(e.getMessage(), "이미 존재하는 회원입니다.");

//        memberService.join(member1);
//        try {
//            memberService.join(member2);
//            fail();
//        } catch(IllegalStateException e) {
//            Assertions.assertEquals(e.getMessage(), "이미 존재하는 회원입니다.");
//        }


        // then


    }

    @Test
    void findMembers() {
    }

    @Test
    void findOne() {
    }
}

@BeforeEach: 각 테스트 실행 전에 호출시켜서 테스트가 서로 영향이 없도록 새로운 개체를 항상 생성하고, 의존관계도 다시 맺어준다.

0개의 댓글