package jpabook.jpashop.domain.service;
import jpabook.jpashop.domain.Member;
import jpabook.jpashop.domain.repository.MemberRepository;
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.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;
import javax.persistence.EntityManager;
import static org.junit.Assert.*;
@RunWith(SpringRunner.class)
@SpringBootTest
@Transactional // 테스트케이스에서 사용 시 테스트 후 롤백시킴
public class MemberServiceTest {
@Autowired MemberService memberService;
@Autowired MemberRepository memberRepository;
@Autowired EntityManager em;
@Test
public void 회원가입() throws Exception {
//given
Member member = new Member();
member.setName("kim");
//when
Long savedId = memberService.join(member);
//then
em.flush();
assertEquals(member, memberRepository.findOne(savedId));
}
@Test(expected = IllegalStateException.class)
public void 중복_회원_예외() throws Exception {
//given
Member member1 = new Member();
member1.setName("kim");
Member member2 = new Member();
member2.setName("kim");
//when
memberService.join(member1);
memberService.join(member2); //예외가 터져야함
//then
fail("예외가 발생해야 한다.");
}
}
기술 설명
기능 설명
참고: 테스트 케이스 작성 고수 되는 마법: Given, When, Then (http://martinfowler.com/bliki/GivenWhenThen.html) 이 방법이 필수는 아니지만 이 방법을 기본으로 해서 다양하게 응용하는 것을 권장
테스트는 격리된 환경에서 실행하고, 끝나면 데이터를 초기화하는 것이 좋다. 그런 면에서 메모리DB를 사용하는 것이 가장 이상적인다.
test 디렉토리에 resources/apllication.yml 파일을 추가하면 테스트케이스는 이 리소스 파일을 참조하게 된다.
spring:
# datasource:
# url: jdbc:h2:mem:test
# username: sa
# password:
# driver-class-name: org.h2.Driver
#
# jpa:
# hibernate:
# ddl-auto: create # or update
# properties:
# hibernate:
# # show_sql: true 운영 환경에서는 system.out.으로 찍으면 안됨
# format_sql: true
logging:
level:
org.hibernate.SQL: debug
org.hibernate.type: trace
<aside> ⚠️ 그런데 스프링 부트는 위의 주석처리한 부분들을 모두 생략해도 알아서 작동시켜준다. DB의 경우 datasource설정 사항이 전혀 없어도 자동으로 메모리DB 방식으로 테스트를 진행시켜준다. diver-class도 현재 등로된 라이브러리를 보고 알아서 찾아준다. ddl-auto도 create-drop 모드로 동작한다. 그냥 알아서 다 해준다.
</aside>