@RunWith(SpringRunner.class)
@SpringBootTest
@Transactional
@Transactional 어노테이션은 EntityManager 활용시 필수적이니 꼭 빼놓지 말자.
😎참고
혹시라도 Transaction 때문에 사라져버린 테이블들을 DB에서 확인하고 싶다면 @Rollback(false) 어노테이션을 붙인다.
Test 폴더 하위에 resources 폴더를 만들고 application.yml 파일을 만든다.
이 파일은 test 적용시 main의 application.yml이 아닌 해당 파일의 설정을 적용할 수 있도록 한다. (main의 yml파일을 오버라이드 한다)
이 때🧐 DB에 대한 설정을 yml에서 따로 안해주면 자동으로 내장 h2메모리를 사용해서 따로 외부DB를 쓸 필요 없이 테스트가 가능하다.
public void 테스트명() throws Exception{}
형태이다.
3. //given //when //then 형태로 나누어서 given: 사전에 주어지는 데이터 when: 테스트 해 볼 상황 then: 기대하는 결과값 으로 정리하면 편하다
4. //then 형태에서 기대하는 결과값 검증하는 방법은 아래를 참고하자
Assertions.assertThat().isEqaulTo();
물론 이 코드 뿐만 아니라 다른 코드도 써서 검증할 수 있다. Assertions.assertThat()함수를 쓴다는 것만 기억하자.
예외 발생 TEST란 말그대로 예외(Exception)이 발동하기를 기대하는 test를 말한다.
따라서 이 TEST는 정상적으로 작동한다면 exception 이 발생해야 하고 exception 이 발생하지 않을 때 test는 fail한다.
@Test(expected = 발생예정Exception.class)
왜냐하면 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 폴더의 구조 상으로 동일해야 한다는 것이다!!
오늘의 공부 끝❣❣❣