【问题标题】:Using @Profile annotation for stubbing external behaviour使用 @Profile 注释来存根外部行为
【发布时间】:2018-12-14 10:59:07
【问题描述】:

有几个 web spring boot java 应用程序。我需要为集成测试准备几个组件。我的任务是模拟所有外部行为,例如其他项目的组件、数据库调用等。我使用 spring 框架中的@Profileannotation 找到了解决方案。这是example。我可以简单地创建新配置文件并为每个配置文件声明两个 bean 实现:一个用于实际使用,用于生产,另一个用于集成测试,用于存根。它看起来像这样:

@Profile("PROD")
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
}

@Profile("MOCK")
@Configuration
@EnableWebSecurity
public class SecurityMockConfig extends WebSecurityConfigurerAdapter {
}

但我对这个设计有疑问。对我来说它看起来有点乱。这个解决方案是否被我认为可以接受我的任务?

【问题讨论】:

  • 你能定义你所说的“集成测试”是什么意思吗?通常,这包括实际的真实数据库等,但不包括生产实例。
  • 通过集成测试,我的意思是所有组件(如果你愿意的话,模块)将被一起测试,以发现它们交互中的错误和错误。一个模块(微服务)与其他模块交互,并且必须进行测试。所以我需要为模块编写存根、模拟,这样就不会有外部数据源的依赖关系可以及时改变。这样,数据将是相同的,测试结果将是可预测的。

标签: java spring spring-boot integration-testing stubbing


【解决方案1】:

这样做,您的模拟及其配置可能会与在生产中运行的应用打包在一起。

这对我来说似乎很奇怪。你会在你交付的 Spring 应用程序中打包你的单元测试吗?我不这么认为。所以我想说这是一个“糟糕”的设计,因为测试依赖项不应该嵌入到生产代码中。

但是,Spring's documentation 关于@Profile 注释是使用环境隔离的例子。

现在,有一个问题需要回答:“集成测试”是什么意思?

这是自动化集成测试吗?或者您想为测试团队以不同的模式运行您的应用程序?

这是不是自动化集成测试,那么就没有理由使用@Profile注解,因为自动化测试和生产代码不会打包在一起。

但是,如果您希望您的用户进行集成测试,那么您可以创建独立的假项目,该项目将用于模拟您正在调用的外部依赖项(数据库、Web 服务等)。

然后,@Profile 可用于从假模式切换到生产模式,但只能通过配置文件:假配置文件将调用您的假外部服务,而生产将调用真正的外部服务。

【讨论】:

  • 集成测试是以自动化方式在服务器上每天执行一次的测试。
  • 然后正如我所提到的,没有必要创建与配置文件关联的模拟。相反,在您要模拟的类上使用简单的模拟(例如使用模拟)。
  • 我是这样理解情况的。模块被视为“黑匣子”。它们将作为简单的应用程序进行部署和启动。将会有另一个组件,它将包含对模块的测试。模块之间通过 API 进行通信。这些 api 绑定到 java 方法。这些方法包含我需要存根的依赖项。因此,如果您创建用于测试的配置文件,您可以使用适合测试的不同环境启动您的应用程序。据我所知,mockito 用于 Junit 测试中的存根,但事实并非如此。
  • 您可以将 mockito 用于任何存根目的。这通常与 JUnit 一起使用,但您也可以将它与 jgiven 一起使用。
  • 我想我找到了一个巧妙的解决方案,其中包括使用 ContextConfiguration、Profile 注释和基于 Java 的 bean 配置。我会尝试一下,让人们知道结果如何。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-15
  • 2015-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-07
相关资源
最近更新 更多