그냥 Command + Shift + T로 테스트를 만듭니다.
라이브 템플릿 (Live Template)
package jpabook.jpashop.service;
import jpabook.jpashop.domain.Member;
import jpabook.jpashop.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 static org.junit.Assert.*;
//...1
@RunWith(SpringRunner.class)
@SpringBootTest
@Transactional //...2
public class MemberServiceTest {
//...3
@Autowired MemberService memberService;
@Autowired MemberRepository memberRepository;
@Test
public void 회원가입() throws Exception {
//...4
//given
Member member = new Member();
member.setName("kim");
//when
Long saveId = memberService.join(member);
//then
assertEquals(member, memberRepository.findOne(saveId)); //...5
}
@Test
public void 중복_회원_예외() throws Exception {
//given
//when
//then
}
}
순수한 단위테스트를 만들게 아니라 JPA가 실제 DB까지 도는게 중요하기 때문에 메모리 모드로 DB까지 엮어서 테스트를 할 것입니다. 완전히 스프링이랑 integration해서 테스트를 합니다.
@RunWith(SpringRunner.class)와 @SpringBootTest가 있어야 스프링 부트와 integration해서 스프링부트를 실제로 올려서 테스트를 할 수 있습니다.
→ 자세히
데이터를 변경하기 위한 @Transactional
@Transactional이 있어야 롤백이 됩니다.
@Transactional가 테스트에서 사용되면 기본적으로 롤백을 해버립니다.
하지만 Service나 Repository에 붙으면 롤백하지 않습니다.
→ 자세히
테스트 케이스이므로 다른 애들이 참조할게 없으니 간단하게 필드 주입을 해도 됩니다.
→ 자세히
assertEquals(member, memberRepository.findOne(saveId));
실행을 해보면 성공합니다.