【问题标题】:Using a mocked object in the actual application (Not test)在实际应用程序中使用模拟对象(未测试)
【发布时间】:2019-03-26 22:41:00
【问题描述】:

这是我的第一个问题! 我试图在我的 spring-boot 应用程序中使用 IBM MQ API(allclient),但是,我没有在所有环境中都提供 MQ。 我已经配置 spring 来创建一个 MQQueueManager bean,当我有一个实际的队列管理器运行时它工作正常,但是当我没有运行时,我无法启动我的应用程序。 当我/其他人没有队列管理器时,我想从我的应用程序中删除 MQQueueManager 依赖项。

为了增加这个 bean 被注入另一个 bean 的问题,所以删除 MQQueueManager 配置类仍然会破坏我的另一个 bean。

我已经尝试了下面的代码,虽然我会加载 Mock bean 而不是真正的 bean。

src/main/java/com/app/config

@Configuration 
@Profile("development")
public class MqConfig { 

    @Bean 
    public MQQueueManager connectToQueue(){
      //connection to real QMGR 
     }

}

src/test/java/com/app/config

@Configuration 
@Profile("test")
public class MqConfig { 

    @Bean
    public MQQueueManager connectToQueue(){
      return Mockito.mock(MQQueueManager.class); 
     }

}

Spring 找不到任何 MQQueueManager bean,因此应用无法启动。

【问题讨论】:

  • 您好,第一篇文章带有清晰的代码示例。在我看来,Mockito 应该只用于测试。我建议你看看你的设计,也许用你自己的接口包装 MQQueueManager,这让你可以选择在开发配置文件中返回一个真正的 IBM 对象,在测试环境中返回一个虚拟实现。最后一个问题 - 现在是 2019 年,您是否必须使用 IBM MQ,您可以使用 rabbitmq 或其他更简单的替代方案吗?
  • 嗨。是的我同意。在我的实际应用程序中使用模拟对象非常反直觉。当我回家时,我会尝试将它包装在一个界面中。我在一个非常缓慢的部门工作,MQ 仍然是标准。我们正在慢慢开始使用微服务 :)

标签: java spring-boot mockito


【解决方案1】:

Spring-boot 有条件注入。有很多注解可以用来有条件地注入 bean。我认为这是您尝试做的。你可以在这里看到一些解释:https://iamninad.com/conditional-bean-creation-in-spring-boot/ 和这里:https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-auto-configuration.html

您不应尝试在应用程序的测试范围之外使用 Mockito。 Mockito(和 JUnit)是用于测试而不是用于生产代码的框架。

【讨论】:

  • 谢谢斯文。这些链接非常有帮助!我没有意识到您可以对 bean 创建有如此多的控制。关于我的问题,我想我找到了一个临时解决方案。我在组件和自动装配上都使用了@Lazy,因此只有在使用时才会创建 bean。显然,如果我尝试使用这个接口,这会引发异常,但至少我的其他接口可以在不需要队列管理器的情况下使用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-19
  • 1970-01-01
  • 2011-11-12
  • 2019-06-10
  • 2013-12-21
  • 2014-06-03
  • 1970-01-01
相关资源
最近更新 更多