web-dev-qa-db-ja.com

プライマリBeanを非プライマリBeanでオーバーライドするSpring

@Primaryを使用してテスト構成で宣言されたテスト中にSpring Beanをオーバーライドしようとしています。 1つの宣言はsrc/main/Javaパスにあり、もう1つの宣言はsrc/test/Javaパスにあります。

ただし、Springは意図的にプライマリBeanを非プライマリBeanに置き換えています。これは、テストに使用したくないものです。実稼働(src/main/Java)構成Beanをコメントアウトするだけで、テスト構成内のプライマリテスト(src/main/test)Beanが必要に応じて使用されます。 (明らかに、テストを実行するたびにコードをコメントアウトすることはできません。)

ログから:

o.s.b.f.s.DefaultListableBeanFactory-Bean 'sqsConnectionFactory'のBean定義を別の定義でオーバーライド:置換 [ルートBean:クラス[null]; scope =; abstract = false; lazyInit = false; autowireMode = 3; dependencyCheck = 0; autowireCandidate = true; primary = true; factoryBeanName = testJmsConfiguration; factoryMethodName = sqsConnectionFactory; initMethodName = null; destroyMethodName =(推定);クラスパスリソースで定義されている[com/foo/configuration/TestJmsConfiguration.class]]

[ルートBean:クラス[null]; scope =; abstract = false; lazyInit = false; autowireMode = 3; dependencyCheck = 0; autowireCandidate = true; primary = false; factoryBeanName = jmsConfiguration; factoryMethodName = sqsConnectionFactory; initMethodName = null; destroyMethodName =(推定);クラスパスリソースで定義されている[com/foo/configuration/JmsConfiguration.class]]

SpringがプライマリBeanを非プライマリBeanに置き換える理由と、SpringでプライマリBeanとして特にマークされたBeanを使用する方法を教えてください

編集: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"})
17
FiguringThisOut

@Primaryは、異なるBeanが注入される条件に一致し、決定を下す必要があるために競合がある場合に、注入ポイントでのみ有効になります。

@Primaryは、Beanの初期化では使用されません。同じBeanを作成する2つの異なるメソッドを使用しており、それらのいずれにも名前を付けていないため、Springはそれをオーバーライドしようとしていると見なしているため、この動作が発生する可能性があります。名前を指定するのが最も簡単な解決策ですが、コンテキストは使用したくないBeanを引き続き初期化することに注意してください。

9
alfcope

@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 {

}
2
hya