봄철 우선 프라이머리 콩과 비프라이머리 콩
테스트 설정으로 선언된 테스트 중에 @Primary를 사용하여 스프링빈을 덮어쓰려고 합니다.한쪽 선언은 src/main/java 경로에 있고 다른 한쪽 선언은 src/test/java 경로에 있습니다.
그러나 스프링은 일부러 프라이머리 빈을 테스트에 사용하고 싶지 않은 프라이머리 빈으로 교체하고 있습니다.프로덕션(src/main/java) 컨피규레이션 bean을 코멘트 아웃하면 테스트 컨피규레이션의 프라이머리 테스트(src/main/test) bean을 원하는 대로 사용합니다(테스트를 실행할 때마다 코드를 코멘트 아웃할 수는 없습니다).
로그에서:
O.S.B.F.S.DefaultListableBeanFactory - 콩 'sqsConnectionFactory'에 대한 콩 정의를 다른 정의로 재정의하고 있습니다. [Root bean: class [scope]; scope=; abstract=false; lazy]를 바꿉니다.Init=false; autowireMode=3, dependencyCheck=0; autowireCandidate=true; primary=true; factoryBeanName=testJmsConfiguration; factoryMethodName=sConnectionFactory; InitodName=firm; destMethodName=d; destMethodName=(inferred); 클래스 리소스/compo에 정의되어 있습니다.
와 함께
[루트빈: 클래스 [루트]; scope=; abstract=false; 게으름Init=false; autowireMode=3, dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=jmsConfiguration; factoryMethodName=factory; initMethodName=factory; destureMethodName=(inferred), 클래스 리소스 [구성/fo/fo]에 정의되어 있습니다.
왜 봄은 프라이머리 콩을 프라이머리 콩이 아닌 콩으로 대체하고 있으며, 프라이머리 콩으로 특별히 표시된 콩을 어떻게 스프링에 사용할 수 있습니까?
편집: src/main/java 설정:
@Configuration
public class JmsConfiguration {
... other bean declarations here ...
@Bean
public SQSConnectionFactory sqsConnectionFactory(Region region) throws JMSException {
return SQSConnectionFactory.builder()
.withRegion(region)
.build();
}
}
테스트 설정:
@Configuration
public class TestJmsConfiguration {
@Bean(name="messageProducerMock")
public MessageProducer mockMessageProducer() {
return new MessageProducerMock();
}
... other bean declarations here ...
@Bean
@Primary
public SQSConnectionFactory sqsConnectionFactory(@Qualifier("messageProducerMock") MessageProducer messageProducerMock) throws JMSException {
... returning setup mock here
}
}
테스트가 있는 클래스에는 다음과 같은 주석이 붙습니다.
@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles(profiles = {"test"})
@Primary
는 다른 콩이 주입 조건에 일치하기 때문에 경합이 발생하여 결정을 내려야 하는 주입 포인트에서만 유효합니다.
@Primary
콩 초기화에서는 사용되지 않습니다.같은 콩을 작성하는 두 가지 다른 방법을 사용하고 있으며, 그 중 어느 것도 이름을 붙이지 않기 때문에 스프링은 콩을 덮어쓰려고 한다고 생각하기 때문에 이 동작이 발생할 수 있습니다.이름을 붙이는 것이 가장 쉬운 해결책이지만, 컨텍스트는 사용하지 않는 콩을 초기화한다는 점에 유의하십시오.
가 것 @ContextConfiguration
츠키노
테스트 설정 클래스의 예(src/test/java/TestConfiguration.class):
@Configuration
@ComponentScan
public class TestConfiguration {
@Bean
RabbitSender rabbitSender() {
return mock(RabbitSender.class);
}
}
테스트 클래스의 예:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TestConfiguration.class)
public class SomeServiceTest {
}
언급URL : https://stackoverflow.com/questions/42564809/spring-overriding-primary-bean-with-non-primary-bean
'source' 카테고리의 다른 글
C#용 JSON 라이브러리 (0) | 2023.02.17 |
---|---|
다국어 워드프레스...어떤 플러그인입니까? (0) | 2023.02.17 |
@Spring Boot Application 주석을 사용한 구성 (0) | 2023.02.17 |
TypeError: nodejs에서 순환 구조를 JSON으로 변환하는 중 (0) | 2023.02.17 |
$_FILE은 체크아웃 시 비어 있습니다. (0) | 2023.02.17 |