회원 레퍼지토리 테스트 케이스 작성

2023. 5. 1. 04:52카테고리 없음

package com.example.demo.repository;

import com.example.demo.Repository.MemberRepository;
import com.example.demo.Repository.MemoryMemberRepository;
import com.example.demo.domain.Member;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.AfterAll;
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);

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

    }
}

  

위 코드는 메모리멤버레퍼지토리가 맞게 실행을 하는지 테스트를 하는 코드이다. 먼저 이 코드는 다른곳에서 참고하여서 쓸게 아니니 굳이 public으로 시작하지 않아도 되서 빼주었고, MemorymemberRepository를 참고하여서 만들거니까 새로운 생성자 함수를 만들어준다.

save() : save() 코드를 test하기 위하여 그 위에 @Test를 넣어 테스트를 할 수 있게끔 만들어주고, 사람의 정보를 저장하는 역할을 하는 것이니까, member라는 생성자를 하나 새로 만들어주고, 그 사람의 이름은 예를 들어 뭐 spring이라고 하고, 레ㅔ퍼지토리에 있는 save에 member를 넣어준다. 그리고 레퍼지토리에  findById에서 내가 넣은 정보가 알맞게 들어갔는지 찾아주는 역할을 하기 위해서 넣어주는데, Null값이 나올것을 방지해서 반환타입을 Optional로 했었는데, 그 값을 꺼내기 위해선 뒤에 .get()을 넣어준다. 그리고 그 값의 변수이름을 result라고 지정을 해준 뒤,  assertions라는 기능을 사용해서 result의 값과 member의 값이 맞는지 확인 시켜주는 코드인 isEqualTO를 넣어준다.(생략 되어있는데, assertThat 안에는 Asserstions.assertThat이라는 함수가 응축되어있다.)

findByName() : findByName()에는 적은 정보가 서로 맞는지 확인시켜주는 코드가 필요하기 때문에 먼저 member1이라는 생성자함수를 만들어주고, 그 이름이 spring1이라고 가정을 하면, repository에 있는 save에 member1을 저장해준다. 그리고 좀 더 정교한 작업을 위해서 member2변수도 똑같이 만들어주지만, 이름은 member2로 만들고, 내가 지금 찾고 싶어 하는 값을 result라는 변수의 이름으로 repository에 findByName에 있는 spring1을 찾겠다는 것을 넣어주고, assertThat을 사용해서 지금 내가 찾는 값과 일치하는지 (.isEqualTo(member1)) 확인시켜주는 코드를 넣어준다.

findAll() : 코드는 위에 findByName()과 거의 유사하고 사용하는 점도 유사하지만 마지막에 좀 다른것이 있다. assertThat에 size가 있는데, 지금 생성자 함수가 두개를 만들었고 같은 값이 나와야 하는 것이 2개여야 하기 때문에 그 size에 대한 Equal값은 2가 되는 것이다. 

* 그런데 여기서 그냥 실행을 하게 된다면 에러가 뜨게 되는데 왜냐면 위에 순서가 코드 쓴순서대로 나오는 것이 아니기 때문에 순서에 의존해서 쓰면 안되고, findAll()에 이미 저장한 객체인 spring1이 있어서 findByName()에서 그 또 다른 객체를 만들 수 없는 것이다. 그렇기 때문에 메모리멤버레퍼지에 가면, 다음과 같은 코드가 있는데, 

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

이 코드와 MemoryMemberRepositoryTest에 가면 다음과 같은 코드가 있는데,

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

}

이 코드의 역할은 Test가 한번 실행되고 끝날때마다 store에 저장되있는 값들을 지워준다. 그렇게 되면 순서가 상관없이 실행이 옳바르게 되는 것이다.