GrowMe

[Error handling] Spring Boot 테스트 환경에서의 생성자 주입 본문

Why don't work?

[Error handling] Spring Boot 테스트 환경에서의 생성자 주입

오늘도 타는중 2022. 6. 21. 12:39
SpringBoot 테스트 환경에서 생성자 주입
# SpringBootTest
# JUnit
# 생성자 주입
# Autowired 주입

*issue 내용

  • 미리 생성하여 빈으로 등록했던 OrderService와 OrderRepository를 생성자 주입하여 테스트 시도
  • ParameterResolutionException 발생

*Why don't work???

  • 직접 생성자를 타이핑하거나 lombok의 @Allargsconstructor, @RequiredArgsConstructor을 사용해 생성자 주입을 시도하면, JUnit5의 Jupiter가 생성자에 적당한 매개변수를 DI해야하는 데 그때 파라미터를 찾아줄 적당한 ParameterResolver를 못찾게된다.
  • 스프링이라면 스프링 컨테이너가 알아서 컨텍스트영역에 등록된 스프링 빈을 찾아서 의존성주입했겠지만 JUnit이 제어하고있는 테스트코드 상황에서는 적당한 빈을 찾을 수 없게된다.

*그럼.. 어떻게 해결하면 될까??

1. JUnit 제어가 아닌 Spring 환경에서 bean을 찾을 수 있게 @Autowired 사용

2. lombok을 이용한 @Setter(onMethod_ = {@Autowired}) 수정자 주입방식

3. Junit에 존재하는, ParameterResolver에 맞는 타입의 파라미터 전달
    - TestInfoParameterResolver

    - RepetitionInfoParameterResolver

    - TestReporterParameterResolver

4. 직접 사용자 ParameterResolver를 작성해서 JUnit가 인식할 수 있는 파라미터 값 전달


*알게된 점

  • Junit의 테스트 환경에서의 빈 주입은 Spring과 다르게 진행이 된다.
  • @SpringBootTest 어노테이션은 Spring Main Application(@SpringBootApplication)을 실행할때와 동일한 모든 Bean을 스캔하여 mock bean을 생성해준다.

*향후 과제

  • Junit5의 테스트 방식
  • 생성자 주입 시 위에 @Autowired를 생략 안하니 제대로 동작하네??.. 왜그럴까
  • ParameterResolver에 대하여
Comments