강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

자전거님의 프로필 이미지
자전거

작성한 질문수

죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.

OPERATION DOUBLE TAP - Spring Batch Test

JobLauncherTestUtils 의존성 주입

해결된 질문

작성

·

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

KILL-9님의 프로필 이미지
KILL-9
지식공유자

반갑다 전거형 수강 속도가 빨라 지켜보고 있던 참인데, 벌써 마지막 작전까지 도달했구나.. 💀

 

💀 [시스템 진단]

테스트 클래스에서 생성자 주입이 안 되는 이유?

단순하다. JUnit이 생성자에 무엇을 전달해야 할지 알 수 없기 때문.

 

그럼 JobLauncherTestUtils같은 빈을 누가 알고 있을까?

당연히 스프링 컨테이너지.

 

따라서 Junit이 Spring 컨테이너의 도움을 받도록 설정하면 생성자 주입을 사용할 수 있다.

 

💀 [해결책 1: 전면적 시스템 장악]

src/test/resources/junit-platform.properties 파일에 아래 한 줄을 추가하라:

spring.test.constructor.autowire.mode=all

이제 모든 테스트 클래스에서 @RequiredArgsConstructor만 달면 끝이다. Spring이 알아서 빈들을 찾아서 생성자에 박아넣어준다.

 

💀 [해결책 2: 개별 타겟 처형]

전역 설정만이 유일한 방법은 아니다. 개별 테스트 클래스에 어노테이션을 다는 방법도 있다.

@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL)
@SpringBatchTest
@SpringBootTest
@RequiredArgsConstructor  
class InFearLearnStudentsBrainWashJobTest {
    private final JobLauncherTestUtils jobLauncherTestUtils; // 처형 완료 💀
}

 

💀 [추가 정보]

더 자세한 정보가 필요하다면 Spring 공식 문서를 참고하라

https://docs.spring.io/spring-framework/reference/testing/annotations/integration-junit-jupiter.html#integration-testing-annotations-testconstructor

 

이제 테스트까지 마스터했으니, 실무에서 Spring Batch로 시스템들을 처형해버려라.💀

- KILL-9, System Terminator

 

 

자전거님의 프로필 이미지
자전거
질문자

헉 킬구형... 이렇게 답변을 빨리 해줄 줄 몰랐어. 고마워!!

 

혹시 아래 부분에 대해서도 답변해줄 수 있을까?

>> 그리고 AutoWired 로 필드 주입을 받으면 동작은 잘 하지만, IDE에서 Could not autowire. No beans of 'JobLauncherTestUtils' type found. 이렇게 빨간 줄이 뜨는 건 왜일까?

 

그리고 수강 속도가 빨라 보이는 건, 챕터 별로 무슨 내용인지 훑어 보다가 수강 완료된 것 처럼 떠서 그래.. 사실 아직 멀었어 😋

KILL-9님의 프로필 이미지
KILL-9
지식공유자

"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

 

💀 [P.S. - 자전거의 진실]

뭐라? 훑어본 거였다고? 자전거인 줄 알았더니 바이크였구나 💀

 

물론 자신만의 속도로 달려도 상관없다. 단 정찰이 끝난 다음엔, 천천히 정복해나가는 것을 권장한다. 이 강의로부터 얻어갈 것을 충분히 얻어가려면, 하나하나 자세히 따라와야 한다. 재미없어 보이는 작전까지도 말이지.

 

자전거든 오토바이든, 목적지에 제대로 도착하는 게 중요하다

그러니 계속 달려라, 자전거! (아니, 오토바이) 💀

 

 

 

 

 

 

 

 

자전거님의 프로필 이미지
자전거
질문자

왜 같은 설명을 들어도 킬구형 설명이 더 이해가 잘 될까?

알겠어 천천히 꼼꼼히 정복할게! 고마워~~ 🚴🏽 🚴🏽 🚴🏽

자전거님의 프로필 이미지
자전거

작성한 질문수

질문하기