source

봄철 우선 프라이머리 콩과 비프라이머리 콩

factcode 2023. 2. 17. 21:40
반응형

봄철 우선 프라이머리 콩과 비프라이머리 콩

테스트 설정으로 선언된 테스트 중에 @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

반응형