inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

OPERATION DOUBLE TAP - Spring Batch Test

JobLauncherTestUtils 의존성 주입

해결된 질문

184

자전거

작성한 질문수 1

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. 이렇게 빨간 줄이 뜨는 건 왜일까?

 

인터넷 서칭해봐도 플러그인 설치를 통한 해결 방법은 있지만 해답은 못 찾았고, 지피티 설명은 이해가 안돼서 여기에 물어봐.

미리 고마워!

java spring spring-boot spring-batch backend

답변 1

2

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

 

 

1

자전거

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

 

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

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

 

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

2

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. - 자전거의 진실]

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

 

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

 

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

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

 

 

 

 

 

 

 

 

1

자전거

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

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

형 이번에 낸 책이랑 강의 내용에 차이가 있어?

1

49

1

형 나 몰래 책내면 모를 줄 알고?

1

38

1

강의 중복 확인 요청

0

29

1

중복내용 제보?!

1

52

2

Json 요청 처리

1

52

2

[건의][6장][작전1] deprecated 메소드

1

55

2

[예제][3장][작전2] windows 에서 마지막 예제

0

43

1

[오타][3장][작전1] 형 이건 빨리 해줘

2

112

2

[오타] "리스너 활용: 시스템 완전 장악 매뉴얼" 부분

1

67

1

[오타] "JobScope와 StepScope 사용 시 주의사항" 부분

1

70

2

spring boot 4 + spring batch 6 설정 변경?

1

120

2

Batch 패키지 설계 — 실무에서 Job 단위 구조

1

103

1

Spring batch를 실행해줄 스케줄러와 batch 실행 환경

1

93

1

메타테이블에 데이터가 생기지 않는 이유

1

121

2

Spring Batch 4.3.10 ExecutionContext 한글 인코딩 이슈 관련 문의

1

119

2

@StepScope 또는 @JobScope와 JobOperator

1

156

5

Remote Partitioning

1

114

2

킬구형 실무에서는 JPA ItemReader / ItemWriter를 더 선호해? 아니면 JDBC itemReader/ItemWriter를 더 선호해?

1

146

2

병렬 중첩

1

107

3

형 코드에 public static class 이게 뭐야 ?

1

144

3

ExitStatus

1

72

2

Batch6: jobOperator.startNextInstance() throws UnexpectedJobExecutionException

1

130

5

jdbc 커서, 페이징에서 일대다 관계 데이터 뻥튀기 조회 처리 방법 질문

1

125

2

SkipPolicy는 여러번 불릴 수 있는가?

1

58

2