2023. 2. 2. 15:24ㆍSpring 강의/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 어노테이션은 테스트가 끝날 때마다 실행되는 코드이다.
테스트가 끝날 때마다 저장되어 있는 회원들을 비워주니까
순서에 상관없 무리없이 잘 작동된다.