생성자를 통한 의존성 주입 방법을 사용하고 있는 경우, 생성자에
@Autowired어노테이션을 명시해야 한다.
스프링 부트 환경에서 테스트를 하던 도중 종종 겪었던 오류이다. 테스트할때 의존성 주입을 꼭 잊지 말자.
기존에는 의존성 주입을 할 때 생성자를 통한 방법을 사용해서 @Autowired 어노테이션을 생략해서 사용하고 있었다. 이 경우 메인 코드에서는 Spring IoC 컨테이너가 의존성 주입을 담당하기 때문에 생성자를 통한 의존성 주입을 할 때 @Autowired 어노테이션을 생략하더라도 스프링 프레임워크가 알아서 잘 처리를 해준다고 한다.
하지만 테스트 코드에서는 Spring 컨테이너가 아니라 JUnit5의 Jupiter가 의존성 주입을 담당하는데 @Autowired가 선언된 객체를 탐색하고 Spring 컨테이너에 요청하여 의존성을 주입하게 된다고 한다. 즉, @SpringBootTest 어노테이션은 Spring Boot와 비슷한 환경을 조성해 주는 것일 뿐이라서 테스트 코드에서 @Autowired가 생략되어 있다면 Jupiter가 객체를 탐색하지 못하기 때문에 예외가 발생하는 것이다.
따라서 테스트 코드에서 생성자를 통한 의존성 주입을 할 때는 아래와 같이 선언해주면 된다.
@SpringBootTest
public class ControllerTest {
private ReviewService reviewService;
private ReviewRepository reviewRepository;
@Autowired
public ReviewController(ReviewService reviewService, ReviewRepository reviewRepository) {
this.reviewService = reviewService;
this.reviewRepository = reviewRepository;
}
}
좋은 정보 얻어갑니다, 감사합니다.