🔙뒤로가기

테스트 요구사항

회원가입 테스트 코드

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>