[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개의 댓글