[SpringBoot] Test 기본 설정

Hyebin Lee·2021년 11월 30일
0

springboot TIL

목록 보기
1/4
post-thumbnail

Test 환경설정

Test Class 의 기본

  1. Test Class는 보통 서비스마다 둔다. 예를들어 MemberService 와 PostService가 있으면 MemberServiceTest 요런 식으로
  2. Test Class 에 붙이는 가장 기본적인 Annotation 들은 다음과 같다
@RunWith(SpringRunner.class)
@SpringBootTest
@Transactional

@Transactional 어노테이션은 EntityManager 활용시 필수적이니 꼭 빼놓지 말자.

😎참고
혹시라도 Transaction 때문에 사라져버린 테이블들을 DB에서 확인하고 싶다면 @Rollback(false) 어노테이션을 붙인다.

  1. Test 안에 필요한 Repository와 Service들을 @AutoWired를 통해서 의존성 주입받는다. 필요한 경우 EntityManager 도 @AutoWired를 통해서 주입받는다.

application.yml 파일

Test 폴더 하위에 resources 폴더를 만들고 application.yml 파일을 만든다.
이 파일은 test 적용시 main의 application.yml이 아닌 해당 파일의 설정을 적용할 수 있도록 한다. (main의 yml파일을 오버라이드 한다)

이 때🧐 DB에 대한 설정을 yml에서 따로 안해주면 자동으로 내장 h2메모리를 사용해서 따로 외부DB를 쓸 필요 없이 테스트가 가능하다.

Test 메소드 개발하기

Test 메소드 개발의 기본

  1. 기본적으로 모든 메서드 위에는 @Test 어노테이션을 붙여준다.
  2. Test 메소드의 기본 형태는
public void 테스트명() throws Exception{} 

형태이다.
3. //given //when //then 형태로 나누어서 given: 사전에 주어지는 데이터 when: 테스트 해 볼 상황 then: 기대하는 결과값 으로 정리하면 편하다
4. //then 형태에서 기대하는 결과값 검증하는 방법은 아래를 참고하자

Assertions.assertThat().isEqaulTo();

물론 이 코드 뿐만 아니라 다른 코드도 써서 검증할 수 있다. Assertions.assertThat()함수를 쓴다는 것만 기억하자.

예외 발생 TEST 작성

예외 발생 TEST란 말그대로 예외(Exception)이 발동하기를 기대하는 test를 말한다.
따라서 이 TEST는 정상적으로 작동한다면 exception 이 발생해야 하고 exception 이 발생하지 않을 때 test는 fail한다.

  1. 메소드 위의 @Test 어노테이션에
@Test(expected = 발생예정Exception.class) 
  1. when에서 예외가 발생하도록 처리한다
  2. given에서 fail("예외가 발생하여야 합니다"); 등의 코드를 작성한다

왜냐하면 when에서 이미 예외가 발생해야하고 예외가 발생한다면 given까지 실행 안되고 바로 rollback 되어 테스트에 통과하게 된다.
그러니 given까지 왔다는 것 자체가 우리가 원하는 예외가 발생하지 않았다는 소리다.

좀 더 깊은 이해를 위한 예외 발생 test의 예시 코드이다.

 @Test(expected = NotEnoughStockException.class)
    public void 상품주문재고초과() throws Exception{
        //given
        Member member = new Member();
        member.setName("이혜빈");
        Address address = new Address("서울","신촌로","170");
        member.setAddress(address);
        em.persist(member);
        Item item = new Book();
        item.setName("참을 수 없는 존재의 가벼움");
        item.setPrice(10000);
        item.setStockQuantity(10);
        em.persist(item);
        //when
        Long orderId= orderService.order(member.getId(),item.getId(),12);
        //then
        fail("상품 주문 재고 초과 에러나야 함");
    }

참고로 여기서의 NotEnoughStockException.class 는 사용자가 직접 정의한 예외이다.
사용자 정의 예외는 다른 포스트에서 더 자세히 다뤄보려고 한다.

주의할 점은 꼭 Test 실행하려고 하는 파일 위치랑 injection 받으려고 하는 파일 위치 (하위 상위 폴더 관계)가 main과 test 폴더의 구조 상으로 동일해야 한다는 것이다!!

오늘의 공부 끝❣❣❣

0개의 댓글