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가 된다.