-
[Springboot] 테스트 코드 작성개발공부/Web 2023. 5. 29. 22:53public interface MemberRepository {
Member save(Member member);
Optional<Member> findById(Long id);
Optional<Member> findByName(String name);
List<Member> findAll();
}Member라는 객체를 저장할 수 있는 MemberRepository라는 객체를 만들고 그 작동을 테스트 하려고 한다.
MemberRepository의 인터페이스는 위와 같이
- 새 멤버를 저장할 수 있는 save
- 멤버를 아이디별로 찾을 수 있는 findById
- 멤버를 이름별로 찾을 수 있는 findByName
- 모든 멤버들의 리스트를 반환하는 findAll
로 이루어진다.
여기서 Member를 domain, MemberRepository를 repository라고 한다. 스프링의 웹 mvc 구조는 controller, service, domain, repository로 이루어진다. controller는 맨 윗단에서 요청을 처리하고 service는 핵심 비즈니스 로직을 구현하는 곳이라고 한다.
아무튼 이런 것들을 다 만들고 테스트를 하려면 테스트 코드를 작성해야 한다.
MemoryMemberRepositoryTest.java
package com.example.demo.repository;
import com.example.demo.domain.Member;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
public 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();
System.out.println("result = " + (result == member));
Assertions.assertEquals(member, result);
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);
}
}save, findByName, findAll 모두 동명의 기능을 테스트하기 위한 테스트 함수이고 그 안에 작성한 코드도 간단하게 동작을 시험할 수 있는 코드이다. 여기서 특이한 것은 @AfterEach annotation이 붙은 afterEach 함수인데, 이 함수 없이 전체 테스트 코드를 돌리면 의도한 것처럼 모든 테스트가 통과되지 않고 findByName에서 에러가 난다. repository가 매 테스트 함수 실행 전에 초기화가 안되기 때문. aftereach를 저렇게 구현해 놓으면 각 함수를 실행하기 전에 repository가 초기화가 된다. (clearStore도 미리 구현해놓은 초기화함수.)
'개발공부 > Web' 카테고리의 다른 글
[Three.js] Geometry (0) 2023.04.03 [Three.js] Transform (0) 2023.03.29 [Three.js] 개발 보조 도구 (0) 2023.03.20 [Three.js] 애니메이션 (0) 2023.03.18 [Three.js] 기본 요소 익히기 (0) 2023.03.06