프로그래밍을 할때 프로젝트는 혼자하는 것보다 협업해서 하는 경우가 훨씬 많다. 그렇게 진행 되다 보면 코드의 길이와 패키지, 파일들의 수가 엄청나게 많아질 수 밖에 없다. 이럴때 testserver없이 프로젝트를 만들면 오류를 찾아가기 힘들고 더욱 복잡해 지기 때문에 testserver는 프로그래밍에서 선택이 아닌 필수조건이 되었다.
테스트 서버를 설명하기 이전에 회원들의 도메인과 레포지토리를 만들어 회원 정보 관리 메소드를 만들어 놓았다.
MemberRepository 인터페이스를 생성하여 메소드들을 추상화 하였다.
package hello.hellospring.repository;
import hello.hellospring.domain.Member;
import java.util.List;
import java.util.Optional;
public interface MemberRepository {
Member save(Member member);
Optional<Member> findById(Long id);
Optional<Member> findByName(String name);
List<Member> findAll();
}
그후 MemoryMemberRepository 클래스를 생성하여 회원들의 정보를 관리하는 메소드들을 만들었다.
MemoryMemberRepository에서 MemberRepository인터페이스를 implements한다.
(마지막에 clearStore()메소드는 테스트 서버를 위해 만든 메소드이기 때문에 잘 기억해두자)
package hello.hellospring.repository;
import hello.hellospring.domain.Member;
import java.util.*;
public class MemoryMemberRepository implements MemberRepository{
private static Map<Long, Member> store = new HashMap<>();
private static long sequence = 0L;
@Override
public Member save(Member member) {
member.setId(++sequence);
store.put(member.getId(),member);
return member;
}
@Override
public Optional<Member> findById(Long id) {
return Optional.ofNullable(store.get(id));
}
@Override
public Optional<Member> findByName(String name) {
return store.values().stream()
.filter(member -> member.getName().equals(name))
.findAny();
}
@Override
public List<Member> findAll() {
return new ArrayList<>(store.values());
}
public void clearStore(){
store.clear();
}
}


테스트 파일의 형식은 메인과 같은 구조로 만들며 클래스 명에는 형식 관례에 따라 기존의 클래스명 + Test.java를 붙여 이름을 정한다.
package hello.hellospring.repository;
import hello.hellospring.domain.Member;
import org.assertj.core.api.Assertions;
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 {
@AfterEach
public void afterEach(){
repostiyory.clearStore();
}
MemoryMemberRepository repostiyory = new MemoryMemberRepository();
@Test
public void save(){
Member member = new Member();
member.setName("jo87");
repostiyory.save(member);
Member result = repostiyory.findById(member.getId()).get();
//Assertions.assertEquals(member, null);
assertThat(member).isEqualTo(result);
}
@Test
public void findByName(){
Member member1 = new Member();
member1.setName("jo88");
repostiyory.save(member1);
//member2 shift+f6 단축키 실행시 한번에 변수 바꾸기 가능
Member member2 = new Member();
member2.setName("jo89");
repostiyory.save(member2);
Member result = repostiyory.findByName("jo88").get();
assertThat(result).isEqualTo(member1);
}
@Test
public void findAll(){
Member member1 = new Member();
member1.setName("jo88");
repostiyory.save(member1);
//member2 shift+f6 단축키 실행시 한번에 변수 바꾸기 가능
Member member2 = new Member();
member2.setName("jo89");
repostiyory.save(member2);
List<Member> result = repostiyory.findAll();
assertThat(result.size()).isEqualTo(2);
}
}
이제 코드를 한줄씩 보며 코드를 설명해 보겠다.
import org.junit.jupiter.api.AfterEach;를 가져와 @AfterEach 어노테이션을 사용하여 가져오는 메소드이다.Member result = repostiyory.findById(member.getId()).get();를 통해 result를 가져오고assertThat(member).isEqualTo(result);를 통해 저장이 잘 되었는지를 확인한다.