@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"})
@Primary
は、異なるBeanが注入される条件に一致し、決定を下す必要があるために競合がある場合に、注入ポイントでのみ有効になります。
@Primary
は、Beanの初期化では使用されません。同じBeanを作成する2つの異なるメソッドを使用しており、それらのいずれにも名前を付けていないため、Springはそれをオーバーライドしようとしていると見なしているため、この動作が発生する可能性があります。名前を指定するのが最も簡単な解決策ですが、コンテキストは使用したくないBeanを引き続き初期化することに注意してください。
@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 {
}