순수 Java JUnit 단위 테스트

Codren·2021년 9월 8일
0

Section 1. 회원 리포지토리 테스트

1. JUnit

자바 프로그래밍 언어용 유닛 테스트 프레임워크

  • org.junit.jupiter.api.Test 를 통해 테스트할 메서드에 @Test Annotation 지정
  • 개발한 기능을 테스트할 때, main 메서드 또는 Controller 를 통해서 해당 기능을 실행 -> 부적합




2. 회원 리포지토리 테스트 케이스

  • 테스트를 진행할 MemoryMemberRepository 객체를 멤버변수로 가져옴
  • Assertions.assertThat() 메서드 - JUnit 을 통해서 테스트의 검증을 지원하는 메서드
  • @AfterEach Annotation - 각 테스트가 종료될 때 마다 이 기능을 실행
  • 테스트가 실행되는 순서는 정해지지 않고 랜덤, 한번에 여러 테스트를 실행하면 메모리 DB에 직전 테스트의 결과가 남을 수 있음 (clear 작업 필요)
package hello.hellospring.repository;

import hello.hellospring.domain.Member;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;

import java.util.List;

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

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);

    }
}




3. Test 결과

  • 테스트 예측결과와 실제결과의 비교



Section 2. 회원 서비스 테스트

1. 회원 서비스 테스트 케이스 생성

  • 테스트 케이스를 작성할 클래스에서 ctrl + shift + t 단축키를 이용하여 테스트 케이스 생성




2. 회원 서비스 테스트 케이스

  • given / when / then Test 전략 사용
  • @BeforeEach Annotation - 각 테스트 수행하기 전에 실행할 부분
  • assertThrows(Exception명.class, () -> 메서드)
package hello.hellospring.service;

import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemoryMemberRepository;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

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

class MemberServiceTest {

    MemberService memberService;
    MemoryMemberRepository memberRepository;

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

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

    @Test
    void 회원가입() {
        //given
        Member member = new Member();
        member.setName("hello");

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

        //then
        Member findMember = memberService.findOne(saveId).get();
        assertThat(member.getName()).isEqualTo(findMember.getName());
    }

    @Test
    public void 중복_회원_예외() {
        //given

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

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


        //when
        memberService.join(member1);
        // memberService.join(member2);

        //then
        IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));
        assertThat(e.getMessage()).isEqualTo(("이미 존재하는 회원입니다."));

    }
}




3. 리팩토링 전

  • 멤버 서비스 테스트에서 메모리 리포지토리를 new 생성함
  • 하지만 이미 서비스 클래스에서는 메모리 리포지토리를 멤버변수로 갖고 있음 (둘은 다른 인스턴스임)




4. 회원 리포지토리 DI (리팩토링 후)

  • 회원 서비스에서 회원 리포지토리를 Constructor DI
  • beforeEach 를 이용해 테스트마다 멤버리포지토리 초기화 및 동기화

0개의 댓글