Recent Posts
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- PytestPluginManager
- mp4fpsmod
- k8s #kubernetes #쿠버네티스
- kotlin
- terminal
- python
- preemption #
- 깡돼후
- tolerated
- 자원부족
- 겨울 부산
- table not found
- JanusWebRTC
- PersistenceContext
- 달인막창
- 코루틴 빌더
- 티스토리챌린지
- pytest
- JanusGateway
- 헥사고날아키텍처 #육각형아키텍처 #유스케이스
- 개성국밥
- VARCHAR (1)
- Spring Batch
- 코루틴 컨텍스트
- taint
- JanusWebRTCGateway
- Value too long for column
- JanusWebRTCServer
- 오블완
- vfr video
Archives
너와 나의 스토리
[Spring] spring test - "Error creating bean with name 'jobLauncherTestUtils': Unsatisfied dependency expressed through method 'setJob' parameter 0" 에러 해결 본문
개발/Spring Boot
[Spring] spring test - "Error creating bean with name 'jobLauncherTestUtils': Unsatisfied dependency expressed through method 'setJob' parameter 0" 에러 해결
노는게제일좋아! 2021. 1. 20. 16:12반응형
[처음 배우는 스프링 부트 2] 책에서 스프링 부트 배치 파트를 따라서 코딩하다가 다음의 에러에 직면했다.
프로젝트 구성
<test code>
- InactiveUserJobTest.java
package com.example.batch;
import com.example.batch.user.enums.UserStatus;
import com.example.batch.user.repository.UserRepository;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.batch.core.BatchStatus;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.test.JobLauncherTestUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import java.time.LocalDateTime;
import static org.junit.jupiter.api.Assertions.assertEquals;
@ExtendWith(SpringExtension.class)
@SpringBootTest
public class InactiveUserJobTest { // 휴면 전환이 올바르게 되었는지 확인하는 테스트 코드
@Autowired
private JobLauncherTestUtils jobLauncherTestUtils;
@Autowired
private UserRepository userRepository;
@Test
public void 휴면_회원_전환_테스트() throws Exception{
JobExecution jobExecution = jobLauncherTestUtils.launchJob();
assertEquals(BatchStatus.COMPLETED, jobExecution.getStatus());
assertEquals(0, userRepository.findByUpdatedDateBeforeAndStatusEquals(LocalDateTime.now().minusYears(1), UserStatus.ACTIVE).size());
}
}
- TestJobConfig.java
package com.example.batch;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.test.JobLauncherTestUtils;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@EnableAutoConfiguration
@EnableBatchProcessing // 배치에 필요한 설정들을 자동으로 주입해줌
@Configuration
public class TestJobConfig {
@Bean
public JobLauncherTestUtils jobLauncherTestUtils(){
return new JobLauncherTestUtils();
}
}
위 코드로 "휴면_회원_전환_테스트" 테스트를 실행시키면
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'jobLauncherTestUtils': Unsatisfied dependency expressed through method 'setJob' parameter 0; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'org.springframework.batch.core.Job' available: expected single matching bean but found 2: InactiveUserJob,inactiveUserJob
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java:722)
다음과 같은 에러가 발생한다.
문제점:
- 어떤 Job을 Bean으로 등록할지 명확하지 않아서 생기는 문제 같다.
해결책:
- Bean으로 등록할 Job을 선언해주자.
- @SpringBootTest에 다음과 같이 설정 코드를 선언해주자.
@SpringBootTest(classes = {TestJobConfig.class, InactiveUserJobConfig.class})
<InactiveUserJobConfig.class>
package com.example.batch.jobs;
import com.example.batch.user.User;
import com.example.batch.user.enums.UserStatus;
import com.example.batch.user.repository.UserRepository;
import lombok.AllArgsConstructor;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepScope;
import org.springframework.batch.item.ItemProcessor;
import org.springframework.batch.item.ItemWriter;
import org.springframework.batch.item.support.ListItemReader;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.time.LocalDateTime;
import java.util.List;
@AllArgsConstructor
@Configuration
public class InactiveUserJobConfig {
@Autowired
private UserRepository userRepository;
@Bean
public Job inactiveUserJob(JobBuilderFactory jobBuilderFactory, Step inactiveJobStep){
return jobBuilderFactory.get("inactiveUserJob")
.preventRestart()
.start(inactiveJobStep)
.build();
}
@Bean
public Step inactiveJobStep(StepBuilderFactory stepBuilderFactory){
return stepBuilderFactory.get("inactiveUserStep")
.<User, User> chunk(10) // chunk 단위로 붂어서 writer() 메서드 실행
.reader(inactiveUserReader())
.processor(inactiveUserProcessor())
.writer(inactiveUserWriter())
.build();
}
@Bean
@StepScope // step 주기에 따라 새로운 빈을 생성
public ListItemReader<User> inactiveUserReader(){
List<User> oldUsers = userRepository.findByUpdatedDateBeforeAndStatusEquals(LocalDateTime.now().minusYears(1), UserStatus.ACTIVE);
return new ListItemReader<>(oldUsers);
}
public ItemProcessor<User, User> inactiveUserProcessor(){
return User::setInactive;
}
public ItemWriter<User> inactiveUserWriter(){
return ((List<? extends User> users) -> userRepository.saveAll(users));
}
}
반응형
'개발 > Spring Boot' 카테고리의 다른 글
[Spring/java] junit 5에서 static method mocking하기 (0) | 2021.03.14 |
---|---|
[Spring] Json 데이터 객체로 받기, Github Webhook 파싱하기 (0) | 2021.03.14 |
[Spring] 스프링 부트 배치 기본 지식과 설정: 용어 정리, Chunk 지향 프로세싱/Tasklet & Listener 설정 / Step 흐름 제어 (0) | 2021.01.18 |
[Spring] @Transaction과 AOP를 이용해서 트랜잭션 처리하기 & 차이점 (0) | 2021.01.13 |
[Spring] 게시판 만들기(2) - Service/Controller/View (0) | 2021.01.11 |
Comments