해결된 질문
작성
·
86
1
킬구형, 테스트 할 때 JobLauncherTestUtils 빈을 주입받는 부분에서 궁금한 게 있어.
@Autowired
private JobLauncherTestUtils jobLauncherTestUtils;
spring batch 테스트를 할 때 JobLauncherTestUtils 을 AutoWired 를 사용해서 필드 주입을 받으면 테스트가 잘 동작하는데,
@RequiredArgsConstructor
class InFearLearnStudentsBrainWashJobConfigTest {
private final JobLauncherTestUtils jobLauncherTestUtils;
생성자 주입으로 받으려고 하면 아래처럼 에러가 나는 이유가 뭘까?
No ParameterResolver registered for parameter [final org.springframework.batch.test.JobLauncherTestUtils jobLauncherTestUtils] in constructor ~~
그리고 AutoWired 로 필드 주입을 받으면 동작은 잘 하지만, IDE에서 Could not autowire. No beans of 'JobLauncherTestUtils' type found.
이렇게 빨간 줄이 뜨는 건 왜일까?
인터넷 서칭해봐도 플러그인 설치를 통한 해결 방법은 있지만 해답은 못 찾았고, 지피티 설명은 이해가 안돼서 여기에 물어봐.
미리 고마워!
답변 1
2
반갑다 전거형 수강 속도가 빨라 지켜보고 있던 참인데, 벌써 마지막 작전까지 도달했구나.. 💀
테스트 클래스에서 생성자 주입이 안 되는 이유?
단순하다. JUnit이 생성자에 무엇을 전달해야 할지 알 수 없기 때문.
그럼 JobLauncherTestUtils같은 빈을 누가 알고 있을까?
당연히 스프링 컨테이너지.
따라서 Junit이 Spring 컨테이너의 도움을 받도록 설정하면 생성자 주입을 사용할 수 있다.
src/test/resources/junit-platform.properties 파일에 아래 한 줄을 추가하라:
spring.test.constructor.autowire.mode=all
이제 모든 테스트 클래스에서 @RequiredArgsConstructor
만 달면 끝이다. Spring이 알아서 빈들을 찾아서 생성자에 박아넣어준다.
전역 설정만이 유일한 방법은 아니다. 개별 테스트 클래스에 어노테이션을 다는 방법도 있다.
@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL)
@SpringBatchTest
@SpringBootTest
@RequiredArgsConstructor
class InFearLearnStudentsBrainWashJobTest {
private final JobLauncherTestUtils jobLauncherTestUtils; // 처형 완료 💀
}
더 자세한 정보가 필요하다면 Spring 공식 문서를 참고하라
이제 테스트까지 마스터했으니, 실무에서 Spring Batch로 시스템들을 처형해버려라.💀
- KILL-9, System Terminator
"Could not autowire. No beans of 'JobLauncherTestUtils' type found." 이라..
인텔리J가 헛소리를 하는 것인가?..
거짓말은 아니다.. 사실이 아니라고 해서 전부 거짓말이라고 할 수 없지. 그러나 확실한 건 헛소리라는 것이다.
JobLauncherTestUtils는 런타임에 동적으로 생성되는 빈이다. @SpringBatchTest를 사용했을 때만 테스트 컨텍스트 안에서 자동으로 등록되지
문제는 인텔리J가 정적 분석만 하다보니 런타임의 @SpringBatchTest → Bean 등록
과정을 정확히 따라가지 못한다는 것에 있다.
즉, 실행 시에는 빈이 생기지만, IDE는 "어? 난 못 찾겠는데?" 하고 붉은 깃발을 꽂는 것이지..
1) IDE에게 복종을 강요하라
@Autowired
@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection") // 더 이상 징징대지 못하게 강요하라
private JobLauncherTestUtils jobLauncherTestUtils;
2) 정신 승리
깔끔하게 무시하라. 어차피 실행할 때 문제 없으니, 이건 그냥 보기 싫은 빨간 줄일 뿐이다.
버그는 죽여서 고치는 것이다. 그러나.. IDE의 헛소리까지 고칠 필요는 없다. 💀
- KILL-9, 시스템 종결자
직접 뜯어보고 싶다면 침투 경로를 알려주겠다. 다음 경로를 따라가도록.
# 1. 첫 번째 침투점 - JAR 파일 해부
spring-batch-test-5.2.2.jar
└── META-INF/spring.factories
# 2. 핵심 타겟 - 소스코드 분해
org.springframework.batch.test.context.BatchTestContextCustomizerFactory
뭐라? 훑어본 거였다고? 자전거인 줄 알았더니 바이크였구나 💀
물론 자신만의 속도로 달려도 상관없다. 단 정찰이 끝난 다음엔, 천천히 정복해나가는 것을 권장한다. 이 강의로부터 얻어갈 것을 충분히 얻어가려면, 하나하나 자세히 따라와야 한다. 재미없어 보이는 작전까지도 말이지.
자전거든 오토바이든, 목적지에 제대로 도착하는 게 중요하다
그러니 계속 달려라, 자전거! (아니, 오토바이) 💀
헉 킬구형... 이렇게 답변을 빨리 해줄 줄 몰랐어. 고마워!!
혹시 아래 부분에 대해서도 답변해줄 수 있을까?
>> 그리고 AutoWired 로 필드 주입을 받으면 동작은 잘 하지만, IDE에서
Could not autowire. No beans of 'JobLauncherTestUtils' type found.
이렇게 빨간 줄이 뜨는 건 왜일까?그리고 수강 속도가 빨라 보이는 건, 챕터 별로 무슨 내용인지 훑어 보다가 수강 완료된 것 처럼 떠서 그래.. 사실 아직 멀었어 😋