구조
데이터 : 회원의 시스템상 ID, 회원의 이름
public class Member {
private Long id; // 시스템상 저장되는 id
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
기능 : 회원 등록, 조회(id, 이름, 전체)
public interface MemberRepository {
Member save(Member member);
Optional<Member> findById(Long id);
Optional<Member> findByName(String name);
List<Member> findAll();
}
외부 저장소 대신 사용할 임시 내부 메모리 저장소이다
public class MemoryMemberRepository implements MemberRepository{
//데이터가 저장되는 곳
private static Map<Long, Member> store = new HashMap<>();
private static long sequence = 0L; // 0, 1, 2 .. 등 key값을 생성해주는 역활
@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(m -> m.getName().equals(name))
.findAny();
}
@Override
public List<Member> findAll() {
return new ArrayList<>(store.values());
}
// 각 테스트가 끝날을 때마다 Map을 지워주는 메소드
public void clearStore(){
store.clear();
}
}
일반적인 테스트 방법
class MemoryMemberRepositoryTest {
MemberRepository repository = new MemoryMemberRepository();
@Test
public void save(){
//이름을 "Spring"으로한 Member객체를 만들고 저장한 후
Member member = new Member();
member.setName("Spring");
repository.save(member);
// 저장된 객체의 id를 이용해서 찾아낸 객체와 같은지 비교
Member result = repository.findById(member.getId()).get();
// 출력을 통해 확인하는 경우
System.out.println("result = " + (member == result));
본 값이 기대한 값과 같은지 다른지 체크해주는 함수를 이용할수도 있다
1. org.junit.jupiter.api 를 이용한 Assertions
Assertions.assertEquals(member, result); <-- 같은 경우
Assertions.assertEquals(member, null); <-- 다른 경우
2. org.assertj.core.api.Assertions 를 이용한 Assertions
문법이 좀더 직관적이다
Assertions.assertThat(member).isEqualTo(result);
Assertions를 static 변수로 변환해서 더 편하게 사용할수도 있다
//import static org.assertj.core.api.Assertions.*;
assertThat(member).isEqualTo(result);
}
@Test
public void findByName(){
Member member1 = new Member();
member1.setName("woonsik");
repository.save(member1);
Member member2 = new Member();
member2.setName("woonsik2");
repository.save(member2);
Member result = repository.findByName("woonsik").get();
assertThat(member1).isEqualTo(result);
}
@Test
public void findAll(){
Member member = new Member();
member.setName("woonsik");
repository.save(member);
Member member1 = new Member();
member1.setName("woonsik1");
repository.save(member1);
Member member2 = new Member();
member2.setName("woonsik2");
repository.save(member2);
List<Member> result = repository.findAll();
assertThat(result.size()).isEqualTo(3);
}
}
@afterEach()를 이용하여 구현 - 각 @Test가 끝났을때마다 해당 메소드를 실행해준다
@AfterEach
public void afterEach(){
repository.clearStore();
}
위에서처럼 기능을 먼저 구현한 후에 테스트케이스를 완성하는 것이 아니라 내가 만들려는 기능의 테스트케이스를 먼저 구현한 후에 기능을 구현하는 방식이다
예를들어 삼각형 별찍기 프로그램이라면 별을 찍는 함수를 먼저 짜는 것이 아닌 삼각형의 별을 체크하는 테스트를 먼저 만들고 삼각형 별찍는 프로그램을 만드는 순서이다