ABOUT ME

Today
Yesterday
Total
  • Spring Framework의 테스트 클래스에서 단일 생성자로 의존성 자동 주입이 되지 않는 이유
    Spring Boot 2024. 10. 9. 21:39

    사전 지식

    Spring Framework 4.3부터 해당 빈(bean)의 생성자가 하나뿐인 경우, 그 생성자에 @Autowired를 붙이지 않아도 생성자 주입이 된다.

    원문

    As of Spring Framework 4.3, an @Autowired annotation on such a constructor is no longer necessary if the target bean defines only one constructor to begin with. However, if several constructors are available and there is no primary/default constructor, at least one of the constructors must be annotated with @Autowired in order to instruct the container which one to use. See the discussion on constructor resolution for details.

    문제 현상

    • Spring Framework 프로젝트에서 JUnit으로 단위 테스트를 작성할 때, @SpringBootTest, @DataJpaTest 등을 사용할 때에는 생성자에 @Autowired를 붙이지 않으면 생성자 주입이 되지 않는다.
    • 즉, 생성자가 하나 뿐이더라도 @Autowired를 생략할 수 없다.
    • 주입 대상 필드에 final을 붙이고 lombok의 @RequiredArgsConstructor를 사용하여 @Autowired를 생략하고 생성자 주입을 받는 방식을 사용하는 경우, 이 방식을 테스트 클래스에 사용할 수 없다.?

    문제 현상의 이유

    • @Autowired 없이 자동으로 생성자 주입을 해주는 것은 스프링 프레임워크가 관리하는 빈(bean)에 대해서만 수행된다.
    • 스프링 프레임워크가 테스트 클래스는 애플리케이션 컨텍스트에서 관리하는 빈으로 간주하지 않는다.

    그럼에도 lombok의 생성자 생성 기능을 사용하고 싶다면?

    • @RequiredArgsConstructor(onConstructor = @__(@Autowired))와 같이 onConstructor 옵션을 사용하여 lombok이 생성하는 생성자에 @Autowired를 붙일 수 있다.

    결론

    • 실제 컴포넌트 클래스에서는 생성자가 하나인 경우 @Autowired 없이도 의존성 주입이 가능하다.
    • 테스트 클래스는 스프링 빈이 아니기 때문에, @Autowired를 사용해 명시적으로 의존성을 주입해야 한다.
    • 테스트 클래스에서 lombok의 생성자 생성 기능을 사용하면서 생성자 주입을 하고 싶다면, @RequiredArgsConstructor(onConstructor = @__(@Autowired))와 같이 사용하면 된다.
Designed by Tistory.