[Java Spring] 5. 회원관리 Test 설계

Hayoon·2022년 7월 11일
0

Member 회원 관리 Test Case 설계

MemberService, MemberRepository 클래스에서 생성한 비즈니스 로직이 실제로 구현되는지 Test Case를 작성해보았다. 대표적으로 회원가입 및 회원 중복 검증 두 가지를 테스트하였다.

package com.example.Summer_vacation1.service;

import com.example.Summer_vacation1.domain.Member;
import com.example.Summer_vacation1.repository.MemberRepository;
import org.assertj.core.api.Assertions;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;

import static org.junit.Assert.*;

@RunWith(SpringRunner.class)
@SpringBootTest
@Transactional // 알아서 rollback 해줌(INSERT문 안 나감)
public class MemberServiceTest {

    @Autowired MemberService memberService;
    @Autowired MemberRepository memberRepository;

    //회원가입
    @Test
    //@Rollback(value = false)
    public void 회원가입() throws Exception {
        Member member = new Member();
        member.setName("A");

        Long saveId = memberService.join(member);
        //assertEquals(member, memberRepository.findOne(saveId));
        Member findMember = memberRepository.findOne(saveId);
        Assertions.assertThat(findMember).isEqualTo(member);
    }
    //중복회원 예외
    @Test(expected = IllegalStateException.class)
    public void 중복회원에외() throws Exception {
        Member member1 = new Member();
        member1.setName("A");
        Member member2 = new Member();
        member2.setName("A");

        memberService.join(member1);
        memberService.join(member2);
    }

}

@RunWith(SpringRunner.class), @SpringBootTest Annotation은 Spring이랑 Integration하기 위함이다. 이를 명시하지 않을 경우, JUnit4에서 SpringBoot와 연동되지 않는다.

다음으로, @Transactional은 Test 실행 시, 자동으로 Rollback을 해주어 Insert문이 나가지 않고 바로 롤백이 된다. (반복적이고 동시다발적 Test Case 실행 시, DB에 Data가 섞이지 않기 하기 위해서)
INSERT문이 실행되는걸 확인하려면 Rollback(value = False)로 설정하면 됨.

Test에서 필요한 Repository, Service를 @Autowired로 컴포넌트(SpringBean)에 등록한다.
파라미터에 들어간 회원을 가입(join)하고 Repository에서 회원의 아이디(PK)로 찾은 findMember 두 개를 "=="로 비교할 순 있으나 정확한 Test를 위해 Assertions.asserThat().isEqualTo()로 비교한다.

중복회원의 경우 예외처리를 통해 Test를 검증한다.

private void validateDuplicateMember(Member member) {
        List<Member> findMembers = memberRepository.findByName(member.getName());
        if (!findMembers.isEmpty()) {
            throw new IllegalStateException("This member already exists.");
        }
    }

로 만약 회원의 이름이 같을 경우에, 중복 예외 처리가 발생한다. 예외 처리문이 발생하는지 검증하기 위해
memberService.join(member1); --- 1
memberService.join(member2); --- 2
두 개의 메서드를 통해 2번문이 실행됐을 때 Exception()가 발생한다.

@Test(expected = IllegalStateException.class)
    public void 중복회원에외() throws Exception {
    ...
    }

@Test (expected = IllegalStateException.class) 작성 시, 예외가 발생할 경우 Test Pass가 된다.

profile
Junior Developer

0개의 댓글