在弹簧和非弹簧测试之间共享属性

时间:2016-08-26 07:47:30

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

我的大部分数据库测试都没有使用Spring,因为这样他们的启动速度要快得多。但我还想运行实际运行整个Spring Boot应用程序的冒烟测试。

我想在一个地方安装数据库连接参数。要做到这一点,我认为我有两个选择:

  1. 在我的非Spring测试中模拟/重用Spring的属性加载
  2. 将我在运行时计算的属性(带有常量的注释不是一个选项)注入烟雾测试中的Spring配置
  3. 知道如何实现这些目标吗?或者也许有一些更简单的方法?

2 个答案:

答案 0 :(得分:0)

您可以将数据库连接参数导出为与application.properties完全相同的系统属性。由于Spring Boot处理外部化配置的方式,这些值将覆盖Spring配置中属性(或YAML,无论您使用哪个)文件中的值,然后您只需要在非Spring测试中使用系统属性。

虽然我建议将这些数据库测试作为Spring套件的一部分 - 但实际上只有在执行单个测试时才能获得速度。除非你有@DirtiesContext个测试或使用不同@ActiveProfiles注释的测试,否则Spring会缓存应用程序上下文,并且每个测试套件只会初始化一次。

以下是the official documentation的引用:

  

Spring TestContext Framework提供Spring ApplicationContexts和WebApplicationContexts的一致加载以及这些上下文的缓存。 支持缓存加载的上下文非常重要,因为启动时间可能会成为一个问题 - 不是因为Spring本身的开销,而是因为Spring容器实例化的对象需要时间来实例化。例如,具有50到100个Hibernate映射文件的项目可能需要10到20秒来加载映射文件,并且在每个测试夹具中运行每个测试之前产生该成本会导致整体测试运行速度变慢,从而降低开发人员的工作效率。

     

默认情况下,一旦加载,配置的ApplicationContext将重复用于每个测试。因此,每个测试套件仅产生一次设置成本,并且后续测试执行速度更快。在此上下文中,术语测试套件意味着所有测试都在同一JVM中运行 - 例如,所有测试都从Ant运行,给定项目或模块的Maven或Gradle构建。

答案 1 :(得分:0)

您可以将数据库连接属性存储在专用的Java db.properties文件中,您可以为标准测试和Spring Boot测试加载该文件。

然后,您可以通过指定自定义db.properties来指示Spring Boot除标准Spring Boot应用程序属性文件外还加载spring.config.location

Spring Boot参考手册的Application property files部分提供了您需要的所有详细信息。

相关问题