Spring/boot
Spring Boot - Test 코드 작성
코딩균
2022. 1. 4. 00:53
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이 옳은지