회원 레파지토리 테스트케이스 작성

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);
	}
}
반응형