如何在 spring-boot 配置中加载 application.yaml 配置以进行硒测试

Posted

技术标签:

【中文标题】如何在 spring-boot 配置中加载 application.yaml 配置以进行硒测试【英文标题】:How to load application.yaml config in spring-boot configuration for selenium testing 【发布时间】:2014-02-24 08:21:24 【问题描述】:

我正在尝试对我的 spring-boot 应用程序运行 selenium 测试。 我想使用我的 application.yml 和 application-test.yml 定义的属性启动应用程序。但是,默认情况下不会发生这种情况。

我尝试像 Dave Syer suggested 那样做,并实现了一个 ApplicationContextInitializer,它使用 YamlPropertySourceLoader 读取 application.yml 和 application-test.yml 文件。

这似乎没有任何效果 - 在我的应用程序测试中将服务器端口设置为 9000 没有效果。

下面是我的测试基类代码:

@ContextConfiguration(classes = TestConfiguration.class, initializers = TestApplicationYamlLoaderApplicationContextInitializer.class)
@SharedDriver(type = SharedDriver.SharedType.ONCE)
@ActiveProfiles("test")
public abstract class IntegrationBase extends AbstractTestNGSpringContextTests 
 ....

下面是我的 ApplicationContextInitializer 的代码:

public class TestApplicationYamlLoaderApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> 
@Override
public void initialize(ConfigurableApplicationContext applicationContext) 
   ConfigurableEnvironment env = applicationContext.getEnvironment();

    YamlPropertySourceLoader loader = YamlPropertySourceLoader.matchAllLoader();
    PropertySource applicationYamlPropertySource = loader.load("application.yml", new FileSystemResource("src/main/resources/application.yml"));
    PropertySource testProfileYamlPropertySource = loader.load("application.yml", new FileSystemResource("src/main/resources/application-test.yml"));

    env.getPropertySources().addFirst(applicationYamlPropertySource);
    env.getPropertySources().addFirst(testProfileYamlPropertySource);
    System.out.println("woohoo!");

还有 application-test.yml

server:
  port: 9000

【问题讨论】:

【参考方案1】:

@ContextConfiguration 不知道 Spring Boot 初始化程序。你试过@SpringApplicationConfiguration吗? (那么您就不需要自定义初始化程序了。)

【讨论】:

能否请您提供解释如何配置 @SpringApplicationConfiguration 的文档的链接,以便我可以指定要用于为属性赋值的 YML 文件?谢谢【参考方案2】:

在你的主配置类中使用@SpringBootApplication,那么spring boot会自动加载application.yml。如果要加载 applicaton-test.yml,只需将当前配置文件设置为测试。这是一个例子:

@SpringBootApplication
public class Main 

    @Bean
    public static PropertySourcesPlaceholderConfigurer placeholderConfigurer() 
        return new PropertySourcesPlaceholderConfigurer();
    

    public static void main(String[] args) 
        System.setProperty("spring.profiles.active", "test");
        SpringApplication.run(Main.class, args);
    


你可能没有 main 方法,只需将配置文件集放在任何适当的位置,即 JVM 启动参数。

参考。 http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html

Spring Boot 允许您将配置外部化,以便您可以在不同的环境中使用相同的应用程序代码。您可以使用属性文件、YAML 文件、环境变量和命令行参数来外部化配置。属性值可以使用 @Value 注释直接注入到您的 bean 中,通过 Spring 的 Environment 抽象访问或通过 @ConfigurationProperties 绑定到结构化对象。

Spring Boot 使用一个非常特殊的 PropertySource 顺序,旨在允许明智地覆盖值。属性按以下顺序考虑:

    您的测试中的@TestPropertySource 注释。 命令行参数。 来自 SPRING_APPLICATION_JSON 的属性(嵌入在环境变量或系统属性中的内联 JSON) ServletConfig 初始化参数。 ServletContext 初始化参数。 来自 java:comp/env 的 JNDI 属性。 Java 系统属性 (System.getProperties())。 操作系统环境变量。 仅具有随机属性的 RandomValuePropertySource。*。 打包 jar 之外的特定于配置文件的应用程序属性(application-profile.properties 和 YAML 变体) 打包在您的 jar 中的特定于配置文件的应用程序属性(application-profile.properties 和 YAML 变体) 打包 jar 之外的应用程序属性(application.properties 和 YAML 变体)。 应用程序属性打包在您的 jar 中(application.properties 和 YAML 变体)。 @Configuration 类上的@PropertySource 注释。 默认属性(使用 SpringApplication.setDefaultProperties 指定)。

【讨论】:

以上是关于如何在 spring-boot 配置中加载 application.yaml 配置以进行硒测试的主要内容,如果未能解决你的问题,请参考以下文章

如何在 CSS 的其余部分同时显示在 CSS 中加载的背景图像

如何在 Flutter Mobile App 中加载和查询本地 json 数据

如何在 Typescript 中加载 dotenv

无法在自定义配置文件提供程序中加载类型

数据存储如何获取页面中加载的当前数据

在 Angular 2 中加载配置 JSON 文件