-
[스프링부트/웹 애플리케이션 개발]회원 기능 테스트스프링&스프링부트 2023. 1. 4. 22:49
테스트 요구사항
- 회원가입 성공
- 회원가입 할 때 같은 이름이 있으면 예외 발생
회원가입 test
@RunWith(SpringRunner.class) @SpringBootTest @Transactional class MemberServiceTest { @Autowired MemberService memberService; @Autowired MemberRepository memberRepository; @Test public void 회원가입() throws Exception { //given Member member = new Member(); member.setName("kim"); //when Long saveId = memberService.join(member); //then assertEquals(member, memberRepository.findOne(saveId)); } }
- transacrional > insert문 확인 할 수 없음
insert문 확인하는 방법 1. @Rollback(false) 추가
@RunWith(SpringRunner.class) @SpringBootTest @Transactional class MemberServiceTest { @Autowired MemberService memberService; @Autowired MemberRepository memberRepository; @Test @Rollback(false) public void 회원가입() throws Exception { //given Member member = new Member(); member.setName("kim"); //when Long saveId = memberService.join(member); //then assertEquals(member, memberRepository.findOne(saveId)); } }
insert문 확인하는 방법 2. em 코드 추가
@RunWith(SpringRunner.class) @SpringBootTest @Transactional 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 saveId = memberService.join(member); //then em.flush(); assertEquals(member, memberRepository.findOne(saveId)); } }
- flush가 db에 쿼리를 날리고 테스트가 끝날 때 @Transactional이 rollback
- 테스트할 때 rollback이 필요한 이유는 테스트를 반복해야 하기 때문에 데이터가 남으면 안 됨
회원중복 test
@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("예외가 발생해야 한다."); }
MemberServiceTest
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.assertEquals; import static org.junit.Assert.fail; @RunWith(SpringRunner.class) @SpringBootTest @Transactional public class MemberServiceTest { @Autowired MemberService memberService; @Autowired MemberRepository memberRepository; @Test //@Rollback(false) > insert문 확인 방법1. public void 회원가입() throws Exception { //given Member member = new Member(); member.setName("kim"); //when Long saveId = memberService.join(member); //then //em.flush(); assertEquals(member, memberRepository.findOne(saveId)); } @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("예외가 발생해야 한다."); } }
- 어노테이션 의미
@RunWith(SpringRunner.class) : Junit 실행하면서 스프링도 함께 실행
@SpringBootTest : 스프링부트를 띄운 상태로 테스트
@Transactional : 롤백
- 테스트케이스 작성 참고
(http://martinfowler.com/bliki/GivenWhenThen.html)
- 테스트를 완전히 격리된 환경에서 하도록 설정
1) test에 resources 디렉토리 추가
2) resources에 application.yml 복사 붙여 넣기
3) application.yml > spring > datasource > url 수정
spring: datasource: url: jdbc:h2:mem:testdb username: sa password: driver-class-name: org.h2.Driver
참고. 스프링부트에서는 별도의 설정이 없으면 메모리 모드로 돌린다. 따라서 application.yml의 코드 생략 가능
spring: # datasource: # url: jdbc:h2:mem:testdb # username: sa # password: # driver-class-name: org.h2.Driver # jpa: # hibernate: # ddl-auto: create-drop # properties: # hibernate: # show_sql: true # format_sql: true logging: level: org.hibernate.SQL: debug org.hibernate.type: trace
728x90'스프링&스프링부트' 카테고리의 다른 글
[스프링부트/웹 애플리케이션 개발]주문 도메인 개발-1 (0) 2023.01.05 [스프링부트/웹 애플리케이션 개발]상품 엔티티 개발 (0) 2023.01.04 [스프링부트/웹 애플리케이션 개발]회원 repository, 회원 service 개발, 인젝션 방법 3가지, @RequiredArgsConstructor (0) 2023.01.04 [스프링부트/웹 애플리케이션 개발]애플리케이션 아키텍처 (1) 2023.01.04 [스프링부트/웹 애플리케이션 개발]엔티티 설계 주의 사항 (0) 2023.01.04