본문 바로가기
Spring/boot

Spring Boot - Test 코드 작성

by 코딩균 2022. 1. 4.

Spring 과 Integration하여 Test

@RunWith(SpringRunner.class)

spring과 integration하여서 메모리 모드로 엮는다

junit4가 지원하는 어노테이션으로, @Autowired @MockBean 이 붙어있는 것들만 application context로 로딩함

  • Runner - test 프로세스들을 계획하고 실행하는 클래스

@SpringBootTest

application context를 모두 적재하여 RunWith를 사용하였을 때보다 무겁다

 

@Transactional 

모든 테스트를 한 후에 roll-back을 하기 위함

 

@RunWith(SpringRunner.class)
@SpringBootTest // unit test 할때는 @DataJpaTest를 써주는 것이 좋다
@Transactional
public class ProductServiceTest{
	
    ...
 
 }

 

 

@Test

Runner가 해당 어노테이션이 붙은 메서드들을 보면서 실행시킬 계획을 잡고 실행시킨다

 

@Test(expected = CustomedException.class)

test의 결과물로 직접 정의한 exception이 나오는 것을 기대하는 경우

 

@Rollback(value=false)

만약 data가 실제 db에 반영되었는지 확인하고 싶으면 롤백이 되지 않도록 처리해주어야 함

class 어노테이션으로 @Transactional을 달아놓았기 때문에!

@Test(expected=IllegalStateException.class)
public void 재고수량예외() throws Exception{
	
    //given
    Product product = new Product("사과", 30);
    
    //when
    productService.buy(32); // 30-32 재고부족으로 IllegalStateException이 나와야 함
    
    //then
    fail("재고 예외 발생해야하는데 발생하지 않음")
 }
@Test
@Rollback(value=false)
public void 상품등록() throws exception{
	//given
    Product product = new Product();
    product.setTitle("사과");
    
    //when
    
    Long id = productService.enroll(product);
    
    //then
    assertEquals("상품등록이 제대로 되지 않음", product, productRepository.findById(id));
}
  • given - 현재 주어진 자원이 무엇인지
  • when - 어떠한 상황이 발생 시 (상품 등록이 발생시)
  • then - 결과의 validation이 옳은지