如何在(单元)测试中使用自动配置的bean,而在main中手动配置了bean?

时间:2018-08-29 15:15:05

标签: java spring unit-testing spring-boot dependency-injection

我对如何在测试环境中进行接线有所兴趣。 我有一种特殊的情况,我想在 main 中有Oracle AQ队列,而在 test 中有ActiveMQ队列。

我正在使用Spring Boot,并且弄清楚了如何使Oracle AQ正常工作。我正在使用Java配置。

OracleAQ

在主配置中,我定义以下bean(仅相关的imo):

  • JmsListenerContainerFactory(DefaultJmsListenerContainerFactory)(JmsListener所需)
  • ConnectionFactory(AQjmsQueueConnectionFactory)(由JmsTemplate和ContainerFactory所需)
  • 数据源(OracleDataSource)(ConnectionFactory所需)

正在使用:

org.springframework:spring-jms
javax.jms:jms
javax.transaction:jta
com.oracle:aqapi
com.oracle:ojdbc8
org.springframework.data:spring-data-oracle

ActiveMQ

此外,当前在另一个项目中,我具有默认的ActiveMQ设置。 在那里,我仅定义了一个bean(也许甚至没有它也可以做到):

  • JmsListenerContainerFactory(DefaultJmsListenerContainerFactory)。

自动接线的是:

  • ConnectionFactory(ActiveMQConnectionFactory)
    • 并且此连接工厂没有数据源(vm内存上的activemq)

我使用:

org.springframework:spring-jms
javax.jms:jms
org.springframework.boot:spring-boot-starter-activemq
org.apache.activemq:activemq-broker

Oracle AQ和ActiveMQ组合

现在,我想将两种方法结合起来:在主测试中使用OracleAQ,在测试中使用ActiveMQ。

  • 我首先添加了Oracle依赖项。没问题。
  • 然后定义数据源(OracleDataSource)Bean。没问题。
  • 然后,我定义ConnectionFactory(jmstemplate和containerfactory所需)。问题: main 现在具有正确的ConnectionFactory,但是 test 也具有此ConnectionFactory。我想获取ActiveMQConnectionFactory,但要在 test 中获取AQjmsQueueConnectionFactory。以前,这是为我自动配置和接线的。

所以我想我的问题确实是:当 main 手动配置了相同接口的bean时,如何在 test 中使用自动配置的bean?

在这种情况下,很难(封装代码)在 test 环境中手动重新组装自动配置的bean,所以我在考虑忽略 main 的方向em>豆左右。 另一个想法是自己创建一个自动配置。

还有其他想法吗?提示?例子吗?

我认为使用依赖注入的想法应该相当容易,但是我不确定如何实现。

我还认为这种情况可能对队列非常特定,例如可以将它概括为在main中使用数据库类型*(例如postgres)在测试中使用H2

谢谢

编辑

https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-auto-configuration.html解释了如何用自己的bean替换自动配置。我需要的是另一种方法。

0 个答案:

没有答案