깡뇽

[Spring] 스프링 입문 - 회원 관리 예제(2) 본문

Web/Spring

[Spring] 스프링 입문 - 회원 관리 예제(2)

깡뇽 2022. 2. 17. 23:30
반응형

인프런 "스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술" 강의를 수강하면서 정리하는 글.

 

회원 리포지토리 테스트 케이스

자바의 main 메서드나 웹 애플리케이션의 컨트롤러를 사용해서 테스트를 하는 방법은 오래 걸리는 등의 단점이 있다. 자바의 JUnit 프레임워크로 테스트를 실행해볼 수 있다.

 

회원 리포지토리 메모리 구현체 테스트

1. save 테스트

src폴더 -> test폴더 -> java 폴더 -> hello.hellospring패키지 -> "repository" Package 생성 -> "MemoryMemberRepositoryTest" Class 생성 (public 아니어도 됨) 후 코드 작성

repository에서 findById하는데 Optional이므로 get()으로 가져올 수 있음

MemberRepository repository = new MemoryMemberRepository();

    @Test
    public void save() {
        Member member = new Member();
        member.setName("spring");

        repository.save(member);

        Member result = repository.findById(member.getId()).get();
        System.out.println("result = " + (result == member));
    }

Test 어노테이션을 사용할 때에 junit을 확인할 수 있다.

저장한 값과 저장소에서 다시 꺼낸 값이 일치하면 잘 저장되었다고 볼 수 있다.

result가 true로 나오는 것을 확인할 수 있다.

 

- Assertions(junit) 사용

case1) Assertions.assertEquals(member,result); 코드 -> 정상적으로 작동

case2) Assertions.assertEquals(member, null); 코드 -> 오류 발생

 

- Assertions(assertj) 사용

최근 junit보다 많이 사용 

case1) Assertions.assertThat(member).isEqualTo(result); 코드 -> 정상 작동

static으로 축약해서 사용할 수 있다.

case2) assertThat(member).isEqualTo(null); 코드 -> 오류 발생

 

2. findByName 테스트

코드 작성

+) 팁 : shift + F6 으로 복붙한 변수들 쉽게 Rename 가능

@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();

        assertThat(result).isEqualTo(member1); // 정상 작동 -> member2를 넣으면 오류 발생
    }

member1 정상 작동
member2 오류 발생

 

3. findAll 테스트

코드 작성

@Test
public void findAll(){
    Member member1 = new Member();
    member1.setName("spring1");
    repository.save(member1);

    Member member2 = new Member();
    member2.setName("spring2");
    repository.save(member2);

    List<Member> result = repository.findAll();
    
    assertThat(result.size()).isEqualTo(2); // 정상 작동 -> 3 오류 발생
}

2 정상 작동
3 오류 발생

4. 전체 클래스 테스트

findByName의 오류 발생! 

메서드마다 따로 동작하도록, 순서와 의존관계가 없도록 설계해야 하는데 이 코드에서는 findAll이 먼저 실행되면서 spring1과 spring2가 이미 저장되어 있는 상태이기 때문에 오류가 나는 것이다.

즉, 이를 해결하기 위해서는 테스트 후에 데이터를 삭제해줘야 한다. 

 

해결 단계1. afterEach 메서드 코드 작성

+ 테스트코드 안에 MemberRepository를 MemoryMemberRepository로 변경

afterEach 메서드는 다른 메서드가 끝날 때마다 실행되는 일종의 콜백 메소드이다.

 

해결 단계2. MemoryMemberRepository 클래스 -> clearStore 메서드 코드 작성

MemoryMemberRepository 클래스
MemoryMemberRepositoryTest 클래스

이제는 실행해도 오류가 나오지 않는다.

반응형