본문 바로가기

개인적으로 공부한 것을 정리해 놓은 블로그입니다 틀린 것이 있으면 댓글 부탁 드립니다!


SPRING BOOT

spring-boot JUnit Test시 유의 할 점

반응형

 

1. Junit 5 에서의 예외상황 Test

 

테스트 코드 작성시에 예외 상황을 테스트할 때  Junit 4 까지는 해당 테스트의 @Test에 속성으로

excepted=예외클래스이름.class 로 지정하여 해당 예외를 예상하는데 사용했지만 

 

Junit5 부터는 Assertions.assertThrows()를 사용해서 예외 상황을 테스트 한다 . 

예외를 받아서 예외 상황에 대해 더 자세히 테스트 할 수 있다 .

 

자세한 내용은 아래 링크로

 

https://junit.org/junit5/docs/current/user-guide/

 

// assertThrows에 첫번째 파라미터로 예상하는 예외 타입과
// 두번쨰 파라미터로 예외가 터질 것으로 예상하는 코드를 excutable로 넣어 준다.

@Test
void nullTest(){

	String name = null;
	
    Assertions.assertThrows(NullPointerException.class,
            ()->{ name.length()}
      );
    
}

//예외를 리턴 받아서 해당 예외에 대한 자세한 내용을 테스트할 수도 있다.
 @Test
    void exceptionTesting() {
        Exception exception = assertThrows(ArithmeticException.class, () ->
            calculator.divide(1, 0));
        assertEquals("/ by zero", exception.getMessage());
 }

 

NullTest의 경우에는 name을 사용하는 name.length() 에서 NullPointerException이 발생할 것이기 떄문에  파라미터로 지정하고 예외가 터질것으로 예상하는 구문을 excutable로  넣는다. 

 

 

 

2. Spring Test에서의  @Transactional의 default는 rollback true 

 

-테스트를 반복적으로 실행하기 위해 아래의 패키지 스프링에서 제공하는 @Transactional의 default는 rollback = true

로 되어 있다 . 만약 값이 실제로 DB로 넘어가는 것을 보고 싶거나 insert 쿼리를 확인하고 싶을때는 EntityManager를 주입받아  강제로 flush() 메서드를  호출 하거나 , @Rollback(value = false)로 지정해 주는 것이 좋다.

 

//스프링 @Transactional  (javax 의 Transactional보다는 사용할 수 있는 기능이 많다.) 

import org.springframework.transaction.annotation.Transactional;

 

 @Test
    //스프링의 트렌젝셔널은 기본적으로 commit이 아니라
    // 롤백을 시키기 떄문에 rollback false 필요
    // 롤백을 유지하면서 인서트 쿼리를 확인하고 싶으면 강제로 flush() 해준다.
    @Rollback(value = false)
    void 회원가입() throws  Exception{
        //given
        Member member = new Member();
        member.setName("member1");

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

        //then
        Assertions.assertEquals(member,memberRepository.findOne(savedId));
    }

 

 

3. 테스트시 DB에 값이 들어가지 않는 것이 좋기 때문에 테스트 환경은 실제 애플리케이션에서 격리 되는 것이 좋다 .

 

- DB를 TestDB로 설정하고 인메모리로 돌리는 것이 좋다  .테스트 패키지 경로에 Resoucese디렉토리를 만들고 application 설정에 필요한 것들을 적으면 Test환경에서는 해당 application.yml을 바탕으로 동작하게된다. H2데이터베이스를 사용한다면  application.yml 이든 application.properties든   데이터 소스 URL을  아래와 같이 jdbc:h2:mem:test 로 해주면 H2 데이터베이스가 jvm에서 구동 되어 testDB 격리하여 사용할 수 있다.

 

-위의 설정 없이도 spring-boot에서는 application.yml에 데이터 소스에 대한 내용이 없을 경우 기본으로 in-memory DB로 동작시 킨다.

 

//yml 예시 
spring:
  datasource:
    url: jdbc:h2:mem:test
    username: sa
    password:
    driver-class-name: org.h2.Driver
반응형