[10강]

2023. 2. 2. 15:24Spring 강의/section3

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

개발한 기능을 실행해서 테스트할 때 자바의 main 메소드를 통해서 실행하거나, 웹 애플리케이션의 컨트롤러를 통해서 해당 기능을 실행한다. 이러한 방법은 준비하고 실행하는데 오래 걸리고, 반복 실행하기 어렵고 여러 테스트를 한 번에 실행하기 어렵다는 단점이 있다. 자바는 JUnit이라는 프레임워크로 테스트를 실행해서 이러한 문제를 해결한다.

 

save() Test 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package hello.hellospring2.repository;
 
import hello.hellospring2.domain.Member;
import org.junit.jupiter.api.Test;
 
import static org.junit.jupiter.api.Assertions.*;
 
class MemoryMemberRepositoryTest {
 
    MemoryMemberRepository repository = new MemoryMemberRepository();
 
    @Test
    public void save(){
        Member member = new Member(); //member라는 객체를 만들어서
        member.setName("spring"); //spring이라는 이름을 줌
 
        repository.save(member); //member를 save에 넣어주면 id가 자동으로 생성됨
 
        //result라는 Member 객체를 만들어서 저장된 member의 id를 넣어준다.
        Member result = repository.findById(member.getId()).get();
 
        //그리고 둘이 비교해서 같으면 true, 다르면 false가 출력되게 한다.
        System.out.println("result = "+ (result == member));
    }
}
cs

실행 결과

그런데 만약 서로 다른 값이라고 가정해보자.

그러면 false가 출력되니까 다른 값이라는 것은 알지만 정확히 어떤 값이 들어왔는지는 알 수 없다.

 

그런 경우 assertThat을 사용할 수 있다.

1
2
        Member result = repository.findById(member.getId()).get();
        Assertions.assertThat(member).isEqualTo(result);
cs

result를 만들어주고 밑에 assertThat을 사용했다.

member와 result가 같은지 확인하는 코드이다.

 

같은 경우

 

다른 경우

1
2
        Member result = repository.findById(member.getId()).get();
        Assertions.assertThat(member).isEqualTo(null);
cs

 

findByName() Test 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 @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();
 
        Assertions.assertThat(result).isEqualTo(member1);
    }
cs

member1이라는 객체에는 spring1이라는 이름을

member2라는 객체에는 spring2라는 이름을 주고

result라는 객체에는 spring1에 대한 값을 주고 member1과

assertThat으로 비교하였다.

 

결과

 

result라는 객체에 spring2에 대한 값을 주고 member1과 

assertThat으로 비교하였다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 @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("spring2").get();
 
        Assertions.assertThat(result).isEqualTo(member1);
    }
cs

결과

 

findAll() Test 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 @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();
 
        Assertions.assertThat(result.size()).isEqualTo(2);
 
    }
cs

member 두 명을 추가하고 findAll()로 List에 담아보자.

그러면 list의 사이즈는 2여야 한다.

 

결과

 

지금까지는 테스트를 개별적으로 돌려봤다면 한꺼번에 모든 테스트를 돌려보겠다.

아까는 잘 되던 findByName()에서 오류가 발생했다.

예상으로는 코드 작성순서대로

save() -> findByName() -> findAll() 순서로 작동될 것이라 생각했지만

테스트 코드는 독립적인 코드이기 때문에

순서를 보장하지 않는다.

그래서 findAll()이 먼저 실행되어 findByName()에서 

spring1과 spring2가 저장될 때 이미 저장된 회원들이라 오류가 난 것이다.

 

이렇듯 테스트 코드를 순서에 의존해 작성하면 안 된다.

그렇다면 지금은 이미 저장되어 있는 회원들이 문제라서 테스트를 못 하는 중이니까

하나의 테스트가 끝날 때마다 저장되어 있는 회원들을 모두 지워주면 된다.

 

MemoryMemberRepository 코드에 clear() 코드를 추가해주고

1
2
3
 public void clearStore(){
        store.clear();
    }
cs

테스트 코드 상단에 @AftreEach 코드를 추가해준다.

1
2
3
4
@AfterEach
    public void afterEach(){
        repository.clearStore();
    }
cs

 

@AfterEach 어노테이션은 테스트가 끝날 때마다 실행되는 코드이다.

테스트가 끝날 때마다 저장되어 있는 회원들을 비워주니까

순서에 상관없 무리없이 잘 작동된다.

'Spring 강의 > section3' 카테고리의 다른 글

[12강]  (0) 2023.02.02
[11강]  (0) 2023.02.02
[9강]  (0) 2023.01.30
[8강]  (0) 2023.01.30