[Spring] 4. 회원관리 예제 (테스트케이스 작성법)
시작하기에 앞서
아래 내용은 김영한님의 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB접근기술에서 발췌한 내용입니다.
강의자료 일부를 발췌하는건 괜찮다고 하셨다.
무료강의로 지식을 공유해주신 김영한님께 다시한번 감사의 인사를 올리겠습니다
(_ _) (유료도 샀어요!)
내가짠 리포지토리가 잘 되는지 확인하고싶을때
1. 메인 메서드를 실행한다 >> 너무 오래걸림
2. 테스트 케이스를 실행한다
package springProject.hello_spring.member_management.repository;
import springProject.hello_spring.member_management.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) {
//store에서 하나하나 꺼내라.
// return store.get(id);
//없으면 어떻게>>? optional로 감싸자
return Optional.ofNullable((store.get(id)));
}
@Override
public Optional<Member> findByName(String name) {
//store에서, member에서 위 파라미터에서 넘어온 name과 같다면 반환한다.
//findAny는 하나만 찾는것 있다? 뒤를 조사 안하고 나오기..
return store.values().stream()
.filter(member -> member.getName().equals(name))
.findAny();
}
@Override
public List<Member> findAll() {
//store에 있는 member들을 모두 꺼낸다.
return new ArrayList<>(store.values());
}
}
위 코드를 테스트해보자
test안의 내가 테스트할 클래스와 동일하게 패키지를 생성하고
Memory클래스이름Test로 작성한다. (관례)
assertEquals는
결과는 출력되지 않지만
체크표시로 성공을 나타낸다
필요한건 저건데 실제로 저장된값은 이거다 라는 오류를 뱉는다.
import org.assertj.core.api.Assertions;
assertThat(member).isEqualTo(result);
위와 같지만 가독성이 좋음
assertEquals는 import org.junit.jupiter.api.Assertions; 로 불러오고
assertThat는 import org.assertj.core.api.Assertions;
세이브 메서드 테스트 코드와
findByName테스트코드
클래스 레벨에서 실행할경우
둘다 테스트 할 수 있다
다만
하나를 실행할때는 문제가 없었지만
모두 테스트를 하면 갑자기 오류가 생기는 것을 볼 수 있다
테스트 순서는 정해지지 않으며,
findAll에서 member1과 member2가 먼저 선언되어 생기는 문제였다
해결법 >>
테스트 패키지가 아닌
우리가 개발한 레파지토리로 가자
테스트용으로 클리어 메서드를 생성한다
그리고 테스트로 돌아와서
AfterEach 어노테이션을 사용한다
하나의 테스트가 끝나면 자동으로 이 메서드가 실행되어 저장소를 초기화해준다.
문제해결!