[SpringBoot JPA 활용 웹 애플리케이션 개발 : 회원 기능 테스트]

Han Gyul Kang·2022년 4월 11일
0

Inflern_Spring_JPA

목록 보기
6/12

테스트 시나리오

  • 회원가입에 성공해야 함
  • 회원가입 시 같은 이름이 있으면 예외 발생

Annotation

  • @Transactional
    Test 케이스에서 Transactional 어노테이션을 사용하면 테스트 종료 후 기본적으로 무조건 Rollback한다.
    하지만 이렇게 되면 Insert Update Delete문을 확인할 수가 없기 때문에 다음과 같은 방법 중 택 1을 하면 된다.

가. 테스트 케이스 Method 위에 @Rollback(value = false)를 선언하여 롤백을 막는다.

나. service 로직을 실행한 뒤 EntityManager의 flush() method를 호출한다.

     // given
     Member member = new Member();
     member.setName("testName");

     // when
     Long id = memberService.join(member);

     // then
     // persistenceContext에 있는 변경 또는 등록건을 강제로 DB에 날림
     em.flush(); 
     // JPA는 같은 트랜잭션 안의 같은 엔티티(PK값이 똑같음)라면 
     // 영속성컨텍스트(persistenceContext)에서 하나로 관리가 됨
     // 고로 결과는 true
     Assert.assertEquals(member, memberRepository.findOne(id));   
  • @RunWith(SpringRunner.class)
    Spring이랑 같이 엮어서 실행 함

  • @SpringBootTest
    스프링부트 컨테이너 안에서 테스트를 돌리기 위함

    @RunWith(SpringRunner.class)
    @SpringBootTest
    @Transactional
    public class MemberServiceTest {
    	...
    }

EntityManager

  • flush()
    persistenceContext에 있는 변경 또는 등록 내용을 데이터베이스에 반영하도록 한다.

  • persist()
    트랜잭션이 모두 통과했을 때 비로소 persistenceContex에 있는 변경 또는 등록건을 flush()한다.

  • persistenceContext : 영속성 컨텍스트


메모리 DB

  • test 디렉토리 이하에 resource 디렉토리를 또 하나 만든다.
  • application.yml 또는 application.properties 파일을 복사해온다.
  • 이렇게 되면 JUnit Test 실행 시 운영의 application.yml이 아닌 test에 있는 application.yml을 읽는다.
  • datasource의 url을 메모리 DB를 바라보도록 설정해도 되지만
    datasource 정보를 모두 삭제 또는 주석처리 하여도 SpringBoot에서 기본적으로 메모리 DB를 생성하여 테스트 케이스를 실행한다.



profile
피아노 치는 개발자

0개의 댓글

관련 채용 정보