이제 회원 리포지토리가 잘 동작하는지 알아보기 위한 테스트케이스를 작성해보도록 하자. 개발한 기능을 실행하여 테스트 할 때 자바의 main 메소드를 통해 실행하거나, 웹 애플리케이션 컨트롤러를 통해서 해당기능을 수행하는 방법들도 있지만 이 방법들은 시간이 오래 걸리고, 반복 수행이 어렵고, 여러 테스트를 한번에 실행하기 어렵다는 단점이 있다. 이 단점을 해결하기 위해 자바는 JUnit 이라는 프레임워크로 테스트를 실행한다.

먼저 test -> java -> com.example.hellospringboot 에 가서 repository 라는 package를 만들어준다.

그리고 이 패키지 안에 MemoryMemberRepositoryTest 라는 Class를 하나 만들어준다.

이 클래스에 위와 같은 테스트 코드를 작성해주자.
Member 클래스에 setName 함수에 this.name=name 을 수행하는 메소드를 하나 추가해주었다.
MemoryMemberRepository 가 잘 동작하는지 테스트 해야하므로 repository라는 MemoryMemberRepository 객체를 하나 선언해준다. 그 후 테스트 코드이므로 @Test를 써줘야 한다.
그 후 save를 test 해보기 위해 member라는 Member객체를 하나 정의해주고, 이 객체의 name에 spring이라는 값을 넣어주었다.
그 후 이 member을 MemoryMemberRepository에 정의해 주었던 save 메소드를 통해 저장한 뒤, 정의해 주었던 findById 메소드를 이용하여 이 객체의 id를 가진 객체, 즉 정의해 준 member을 result에 넣어준다(findById 메소드는 반환형이 Optional<Member> 이였으므로 get()을 통해 가져와야함).
그 후 Assertions.assertThat(member).isEqualTo(result); 구문을 활용하여 정의해준 member객체가 result와 같은지 확인한다.
위 코드를 실행해보면

오류없이 테스트를 무사히 마친 것을 볼 수 있다.
Assertions.assertThat(member).isEqualTo(null);
코드의 마지막 줄을 위와 같이 변경한 후 실행해보면

member가 null이 아니기 때문에 위와 같이 테스트 오류가 뜬 것을 확인할 수 있다!
이제 findByName 메소드에 오류가 없는지 확인해보자.

MemoryMemberRepositoryTest 클래스에 위와 같은 코드를 추가해준다.
member1 객체와 member2 객체의 name에 각각 spring1, spring2 을 넣어준 후, 객체를 repository.save를 통해 MemoryMemberRepository에 있는 store에 저장해준다.
그 후 MemoryMemberRepository 클래스에서 정의해주었던 findByName 메소드를 통해 spring1의 name을 가진 Member 객체를 반환하여 result에 넣어준 뒤 이 result가 member1 객체와 같은지를 묻고 있다.
위의 Test를 돌려보면

위와 같이 오류없이 테스트가 끝난 것을 확인할 수 있다.
Assertions.assertThat(result).isEqualTo(member2);
위와 같이 member1을 member2로 바꾼 뒤 Test를 돌려보면

위와 같이 테스트 오류가 뜬 것을 확인할 수 있을 것이다.
테스트를 각각 실행하지 않고도 Class 옆에 재생버튼으로 테스트를 실행하면 모든 테스트를 동시에 실행할 수도 있다.
이제 findAll 메소드에 오류가 없는지 확인해보자.

위의 코드도 추가로 작성해준다.
Member 객체이고 name이 각각 spring1, spring2인 member1과 member2를 정의해준 뒤 store에 저장해준다. 그 후 MemoryMemberRepository 클래스에서 정의해 주었던 findAll 메소드를 이용하여 store에 저장되어있는 모든 Member 객체들의 List를 result에 넣어준다. 그 후 result.size() 가 2임을 물어보고있다. 현재 우리는 두 객체를 store에 넣어주었으므로 위는 알맞은 코드이다.
이 Test를 돌려보면

위와 같이 오류가 없이 잘 돌아간 것을 확인할 수 있다.
Assertions.assertThat(result.size()).isEqualTo(3);
위와 같이 2를 3으로 바꿔준 뒤 실행해보면

위와 같이 테스트 오류가 뜬 것을 확인할 수 있을 것이다!!
그런데 Test를 하나씩이 아니라 모두 한꺼번에 진행하면

위와 같이 오류가 뜨게 된다.
그 이유는 각 테스트는 순서가 보장되어있지 않고, 어떤 Test에서 store에 객체를 저장해 주었는데 이 Test가 끝난 후 다른 Test에서 이를 그대로 사용했기 때문이다. 따라서 우리는 어떤 Test가 끝나면 데이터를 clear해주는 코드를 추가로 작성해주어야 한다.

위와 같이 store을 비워주는 clearStore 메소드를 MemoryMemberRepository 클래스에 정의해준 뒤,

MemoryMemberRepositoryTest 클래스에 @AfterEach를 활용하여 각 Test가 끝난 후 clearStore 메소드가 실행될 수 있도록 해준다. 이제 한번에 모든 Test를 실행해도 오류가 생기지 않는다.
'BackEnd > Spring Boot' 카테고리의 다른 글
회원 Service 테스트하기 (2) | 2022.10.13 |
---|---|
회원 Service 만들기 (0) | 2022.10.11 |
회원 Domain과 Repository 만들기 (0) | 2022.10.07 |
API 란? (4) | 2022.10.03 |
MVC 와 템플릿 엔진 (0) | 2022.10.01 |
이제 회원 리포지토리가 잘 동작하는지 알아보기 위한 테스트케이스를 작성해보도록 하자. 개발한 기능을 실행하여 테스트 할 때 자바의 main 메소드를 통해 실행하거나, 웹 애플리케이션 컨트롤러를 통해서 해당기능을 수행하는 방법들도 있지만 이 방법들은 시간이 오래 걸리고, 반복 수행이 어렵고, 여러 테스트를 한번에 실행하기 어렵다는 단점이 있다. 이 단점을 해결하기 위해 자바는 JUnit 이라는 프레임워크로 테스트를 실행한다.

먼저 test -> java -> com.example.hellospringboot 에 가서 repository 라는 package를 만들어준다.

그리고 이 패키지 안에 MemoryMemberRepositoryTest 라는 Class를 하나 만들어준다.

이 클래스에 위와 같은 테스트 코드를 작성해주자.
Member 클래스에 setName 함수에 this.name=name 을 수행하는 메소드를 하나 추가해주었다.
MemoryMemberRepository 가 잘 동작하는지 테스트 해야하므로 repository라는 MemoryMemberRepository 객체를 하나 선언해준다. 그 후 테스트 코드이므로 @Test를 써줘야 한다.
그 후 save를 test 해보기 위해 member라는 Member객체를 하나 정의해주고, 이 객체의 name에 spring이라는 값을 넣어주었다.
그 후 이 member을 MemoryMemberRepository에 정의해 주었던 save 메소드를 통해 저장한 뒤, 정의해 주었던 findById 메소드를 이용하여 이 객체의 id를 가진 객체, 즉 정의해 준 member을 result에 넣어준다(findById 메소드는 반환형이 Optional<Member> 이였으므로 get()을 통해 가져와야함).
그 후 Assertions.assertThat(member).isEqualTo(result); 구문을 활용하여 정의해준 member객체가 result와 같은지 확인한다.
위 코드를 실행해보면

오류없이 테스트를 무사히 마친 것을 볼 수 있다.
Assertions.assertThat(member).isEqualTo(null);
코드의 마지막 줄을 위와 같이 변경한 후 실행해보면

member가 null이 아니기 때문에 위와 같이 테스트 오류가 뜬 것을 확인할 수 있다!
이제 findByName 메소드에 오류가 없는지 확인해보자.

MemoryMemberRepositoryTest 클래스에 위와 같은 코드를 추가해준다.
member1 객체와 member2 객체의 name에 각각 spring1, spring2 을 넣어준 후, 객체를 repository.save를 통해 MemoryMemberRepository에 있는 store에 저장해준다.
그 후 MemoryMemberRepository 클래스에서 정의해주었던 findByName 메소드를 통해 spring1의 name을 가진 Member 객체를 반환하여 result에 넣어준 뒤 이 result가 member1 객체와 같은지를 묻고 있다.
위의 Test를 돌려보면

위와 같이 오류없이 테스트가 끝난 것을 확인할 수 있다.
Assertions.assertThat(result).isEqualTo(member2);
위와 같이 member1을 member2로 바꾼 뒤 Test를 돌려보면

위와 같이 테스트 오류가 뜬 것을 확인할 수 있을 것이다.
테스트를 각각 실행하지 않고도 Class 옆에 재생버튼으로 테스트를 실행하면 모든 테스트를 동시에 실행할 수도 있다.
이제 findAll 메소드에 오류가 없는지 확인해보자.

위의 코드도 추가로 작성해준다.
Member 객체이고 name이 각각 spring1, spring2인 member1과 member2를 정의해준 뒤 store에 저장해준다. 그 후 MemoryMemberRepository 클래스에서 정의해 주었던 findAll 메소드를 이용하여 store에 저장되어있는 모든 Member 객체들의 List를 result에 넣어준다. 그 후 result.size() 가 2임을 물어보고있다. 현재 우리는 두 객체를 store에 넣어주었으므로 위는 알맞은 코드이다.
이 Test를 돌려보면

위와 같이 오류가 없이 잘 돌아간 것을 확인할 수 있다.
Assertions.assertThat(result.size()).isEqualTo(3);
위와 같이 2를 3으로 바꿔준 뒤 실행해보면

위와 같이 테스트 오류가 뜬 것을 확인할 수 있을 것이다!!
그런데 Test를 하나씩이 아니라 모두 한꺼번에 진행하면

위와 같이 오류가 뜨게 된다.
그 이유는 각 테스트는 순서가 보장되어있지 않고, 어떤 Test에서 store에 객체를 저장해 주었는데 이 Test가 끝난 후 다른 Test에서 이를 그대로 사용했기 때문이다. 따라서 우리는 어떤 Test가 끝나면 데이터를 clear해주는 코드를 추가로 작성해주어야 한다.

위와 같이 store을 비워주는 clearStore 메소드를 MemoryMemberRepository 클래스에 정의해준 뒤,

MemoryMemberRepositoryTest 클래스에 @AfterEach를 활용하여 각 Test가 끝난 후 clearStore 메소드가 실행될 수 있도록 해준다. 이제 한번에 모든 Test를 실행해도 오류가 생기지 않는다.
'BackEnd > Spring Boot' 카테고리의 다른 글
회원 Service 테스트하기 (2) | 2022.10.13 |
---|---|
회원 Service 만들기 (0) | 2022.10.11 |
회원 Domain과 Repository 만들기 (0) | 2022.10.07 |
API 란? (4) | 2022.10.03 |
MVC 와 템플릿 엔진 (0) | 2022.10.01 |