Coding/Spring(Boot)

[Spring]repository test case 작성

민톨이 2024. 6. 9. 23:28
728x90

Test case

 MemberRepository repository = new MemoryMemberRepository();

    @Test
    public void save() {
        
    }

 

MemberRepository라는 클래스의 테스트 케이스를 만든다면 이런 틀이다.

이 상태에서 run을 눌러 바로 실행할 수 있다.

 

package hello.hello_spring.repository;

import hello.hello_spring.domain.Member;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;

import java.util.Optional;

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

class MemoryMemberRepositoryTest {

    MemberRepository repository = new MemoryMemberRepository();

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

 

- save라는 메서드를 만들어서 member에 spring을 세팅한다.

- repository에 member를 저장하고

- findById로 내가 넣은게 제대로 들어갔나 확인가능 (Optional에서 값을 꺼낼 때는 get()을 사용하여 꺼내기 가능) = 이것을 result라고 하자

- 검증 : assertThat().isEqualTo()

=>

Assertions.asserthat~~~~에서 Assertions를 Add on-demand~~~~를 눌러서 import(?)하게 되면

앞의 Assertions는 생략되고 그 후부터는 다 assertThaat(~)부터 쓸 수 있다.

 

 

findByName()

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


    }

 

<이름으로 찾는 findByName 테스트 생성>

member를 생성하고 spring1을 셋팅 후 repository에 member1을 저장한다. (member2도 같은 맥락)

그리고 result에 spring1을 찾는 내용을 담는다.

assertThat으로 result(spring1)는 member1과 같냐는 검증 시작.

=> 실행 후 true이면 초록불이 뜨고 false라면 빨간 불이 뜬다.

 

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

 

각각 member1/2와 spring1/2를 담아주고

assertThat으로 size(총 갯수)가 2와 같냐 = 2개냐 (member1, 2 총 2개) 테스트

 

2가 맞으니 초록불이 뜨고, 만약 여기서 isEqualTo(3)을 적는 경우 false로 빨간 불이 뜨게 된다.

 


Best Test란? = 

 

* 메서드 마다 run을 눌러 테스트하는 경우와 달리 전체를 한번에 테스트하는 경우에는 메서드 순서가 엉켜서 오류가 날 수도 있다.

= 고로 하나 테스트 하고 하나를 클리어 해주는 방식을 권장한다.

=> 테스트 클래스 내에 테스트 하나가 끝날때마다 리포지토리를 깔끔하게 지워주는 코드를 넣어준다

 

+++ 1. 테스트하려는 클래스의 원본에는 

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

저장소를 clear하는 메서드를 하나 넣어둔다.

 

2. 테스트 케이스 클래스에는

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

 

이렇게 AfterEach를 사용하여 저장소를 clear하는 메서드를 만든다.

 

이렇게 클리어 코드를 작성해두면 전체 테스트 검사를 했을 시 메서드 순서가 얽혀 오류가 나는 일을 줄일 수 있다.