Springboot 환경에서 테스트 코드를 효율적으로 작성하고 관리하는 방법과 도구를 사용해보기
JUnit을 사용한 테스트 코드 작성 중에 Service 로직을 테스트해 본다고 가정할 때,
실제 로직 코드에서는 Repository Bean을 주입받아 사용했는데
테스트 코드에서 Spring이 동작하지 않는데 어떻게 Repository 의존성을 처리해야하는가?
목적은 '단위테스트' 이기 때문에 분리되어있는 다른 클래스는 실체화하지 않고
가짜 객체(Mock Object)를 선언한다. 실제 인스턴스화 하지 않으며 만들어져있다고 '가정'만 하는 것.
예시) @Mock ProductRepository productRepository;
@Mock 어노테이션을 명시실제 인스턴스화 하지 않아서 따라오는 문제점이 있는데
예를들면 productRepository에서 어떤 상품을 찾는 로직이라면 가짜이기 때문에 값을 가져올 수 없다.
이 때는 리턴될(내가 나오길 기대하는, 예상되는) 그 상품 객체product를 직접 만들어두고 given(testMethod()).willReturn(expectedProduct); 으로 테스트가 되는지 확인할 수 있다.
정답을 미리 만들어놓는 느낌이다.
예시) given(productRepository.findById(productId)).willReturn(Optional.of(product));
@SpringBootTest 애너테이션을 사용하여 Spring이 동작하도록 함@Order(n) (n은 정수)@TestMethodOrder(MethodOrderer.OrderAnnotation.class) 테스트 클래스에 추가@Mock대신 @MockBean을 사용