본문 바로가기

컴퓨터/Spring Boot

[TIL] Spring Boot(intellij) - 회원 관리 개발(2) - 테스트 구현

* 인프런 김영한 강사님의 스프링 입문 강의 정리

지난 강의에서 작성한 리포지토리와 서비스에 대해 각각 테스트 케이스를 작성한다.

테스트는 src/test/java의 하위 폴더에 생성하며 main의 구조를 그대로 가져온다.

테스트 파일 경로

자바는 JUnit 프레임 워크로 테스트를 실행한다.

JUnit?
- java에서 단위테스트(unit test)를 지원해주는 프레임워크
- assert()로 테스트 판별
- 테스트 어노테이션을 제공한다. ex) @Test, @Before..

 

 

** ctrl+shift+T - 테스트 클래스 파일을 자동으로 생성해준다.

 

 

▶ 리포지토리(memoryMemberRepository) 테스트

package myStudyspring.myStudyspring.repository;

import myStudyspring.myStudyspring.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.*;

//테스트는 순서의 의존관계 없이 설계가 되어야함
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);

          //optional로 리턴되므로 get으로 데이터를 꺼냄
          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);
     }
}

*한번에 테스트를 진행할 경우 메모리에 직전의 결과가 남아 에러가 날 수 있다. 

*@AfterEach() : 각 테스트가 종료될 때마다 실행하는 어노테이션으로

                          예제에서는 리포지토리의 clearStore()를 실행하여 메모리를 비워준다.

*결론적으로 테스트는 독립성이 있어야하며 순서에 의존 관계가 있는 것은 좋은 테스트라 할 수 없다.

 

 

*Assertions 

테스트 결과를 확인할 때 사용한다.

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

 

위와 같이 static import 를 하고

assertTaht(data).isEqualTo(data2);

로 사용한다.

 

 

▶ 서비스(MemberService) 테스트

package myStudyspring.myStudyspring.service;

import myStudyspring.myStudyspring.domain.member;
import myStudyspring.myStudyspring.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.*;

//c+shi+t -> 자동으로 테스트 클래스 생성
class MemberServiceTest {

    MemberService memberService;
    memoryMemberRepository repository;

    @BeforeEach
    public void beforeEach(){
        repository = new memoryMemberRepository();
        memberService = new MemberService(repository);
    }

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

    @Test
    void join() {
        //given
        member member = new member();
        member.setName("hello");

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

        //then
        member findMember = repository.findById(saveId).get();
         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);

        //방법 1 - assertThrows 사용
        IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));

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


        //방법 1 - try-catch 사용
        /* try {
            memberService.join(member2);
            fail();
         }catch(IllegalStateException e){
            assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
        }*/
    }
}

*@BeforeEach() : 각 테스트가 실행 전에 호출된다. 테스트가 서로 영향이 없도록 새로운 객체를 항상 생성한다.

 

- memberService에서 생성한 리포지토리 객체가 있고 테스트 클래스에서도 또 객체를 생성하면 두개의 다른 객체가 만들어진다.

따라서 서비스에서는 리포지토리 객체를 생성하지 않고,

테스트에서는 테스트 실행 전 리포지토리 객체를 생성한다.

 


//[MemberService]
private final memberRepository memberRepository;

    public MemberService(memberRepository memberRepository){
        this.memberRepository = memberRepository;
    }
    
    
    
 //[MemberServiceTest]
 MemberService memberService;
 memoryMemberRepository repository;

    @BeforeEach
    public void beforeEach(){
        repository = new memoryMemberRepository();
        memberService = new MemberService(repository);
    }

 

728x90