주노 님의 블로그

[Spring] 4. 회원관리 예제 (테스트케이스 작성법) 본문

공부/Spring

[Spring] 4. 회원관리 예제 (테스트케이스 작성법)

juno0432 2024. 7. 28. 14:44

시작하기에 앞서

아래 내용은 김영한님의 스프링 입문 - 코드로 배우는 스프링 부트, 웹 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 어노테이션을 사용한다

하나의 테스트가 끝나면 자동으로 이 메서드가 실행되어 저장소를 초기화해준다.

 

문제해결!