회원 레파지토리 테스트케이스 작성
2024. 3. 23. 16:26ㆍ스프링
반응형
회원을 관리하는 repository를 만들었다.
일단 repository를 interface로 선언하여 repository를 구현하는 객체를 유연하게 바꿀수 있도록 한다.
MemberRepository.java
package groupInfo.study.repository;
import java.util.List;
import java.util.Optional;
import groupInfo.study.domain.Member;
public interface MemberRepository {
Member save(Member member);
Optional<Member> findById(Long id);
Optional<Member> findByName(String name);
List<Member> findAll();
//Optional로 감싸서 반환하면 null pointer exception 방지할 수 있다.
}
MemberRepository.java를 구현한 MemoryMemberRepository.java 이다. Map으로 선언한 변수에 데이터를 관리한다. DB에서 데이터를 관리하는게 아닌 메모리에 데이터를 관리한다. 만약 나중에 RDB로 변환된다면 또다른 MemberRepository.java를 구현한 객체를 만들면 된다.
MemoryMemberRepository.java
package groupInfo.study.repository;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import groupInfo.study.domain.Member;
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;
}
//id로 찾기
@Override
public Optional<Member> findById(Long id) {
// Optional로 감싸서 store.get(id)가 null이여도 Exception이 나지 않게 할 수 있다.
return Optional.ofNullable(store.get(id));
}
//name으로 찾기
@Override
public Optional<Member> findByName(String name) {
//store의 value 중에서 loop를 돌며 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();
}
}
위에 구현한 repository를 테스트해보자. 테스트를 하려면 main 메소드와 같이 실행할 수 있는 클래스를 만들어야 한다. 테스트 케이스를 만들때 src/test/java 경로에 package, class를 만들어 테스트한다. 보통 class 이름은 테스트하려는 객체이름 끝에 Test를 붙여서 만든다.
MemoryMemberRepository.java
package repository;
import java.util.List;
//import org.junit.jupiter.api.Assertions;
import org.assertj.core.api.*;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
import groupInfo.study.domain.Member;
import groupInfo.study.repository.MemberRepository;
import groupInfo.study.repository.MemoryMemberRepository;
//다른곳에 사용을 안하니 굳이 public 으로 안해도됨
public class MemoryMemberRepositoryTest {
MemoryMemberRepository repository = new MemoryMemberRepository();
//@Test로 작성된 테스트는 순서는 보장이 안된다 그래서 어떤게 먼저 실행될지 모름
//그래서 각 @Test가 수행될때마다 repository를 비워주는걸 테스트가 끝날때마다 해줘야 한다.
//이때 @AfterEach를 이용하면 테스트가 끝날때마다 메소드가 실행된다. 수행되는메소드에 repository를 비워주면 된다.
@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();
//Assertions로 원하는 결과와 실제 결과가 일치하는지 확인
//import org.junit.jupiter.api.Assertions; 이렇게 import 하면 assertEquals 사용
//Assertions.assertEquals(member, result);
//import org.assertj.core.api.*; 이렇게 import 하면 assertThat과 isEqualTo 사용
Assertions.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();
Assertions.assertThat(result).isEqualTo(member1);
}
@Test
public void findAll() {
Member member1 = new Member();
member1.setName("spring3");
repository.save(member1);
Member member2 = new Member();
member2.setName("spring4");
repository.save(member2);
List<Member> result = repository.findAll();
Assertions.assertThat(result.size()).isEqualTo(2);
}
}
반응형
'스프링' 카테고리의 다른 글
@Configuration 스프링빈 등록 (0) | 2024.05.14 |
---|---|
컴포넌트 스캔으로 의존관계 설정 (0) | 2024.05.13 |
스프링부트 웹 개발 방식(api) (0) | 2024.03.19 |
스프링부트 웹 개발방식(MVC) (0) | 2024.02.18 |
스프링부트 웹 개발 방식(정적 컨텐츠) (0) | 2024.02.18 |