在 Citrus TestNG 测试期间 Spring Boot 未加载测试特定应用程序属性

Posted

技术标签:

【中文标题】在 Citrus TestNG 测试期间 Spring Boot 未加载测试特定应用程序属性【英文标题】:Spring Boot Not Loading Test Specific Application Properties During Citrus TestNG Tests 【发布时间】:2019-07-30 00:47:47 【问题描述】:

在运行我的 Citrus 集成测试时,我试图让 Spring Boot 自动加载 src/test/resources/application.properties 文件而不是 src/main/resources/application.properties 文件。这些属性在测试期间可用,但它们不会覆盖主 Spring Boot 应用程序中使用的主要属性。

这是我目前的配置:

src/main/java/EventPublisher.java

@SpringBootApplication
@ComponentScan
@EnableAutoConfiguration
public class EventPublisher 

  public static void main(String[] args) 
    SpringApplication.run(EventPublisher.class, args);
  

src/main/resources/application.properties

consumer.to=stream:out

src/test/java/EndpointConfig.java

@Configuration
@PropertySource("classpath:application.properties")
@SpringBootTest
public class EndpointConfig 
...

src/test/java/CitrusTestsIT.java

@Test
@SpringBootTest
public class AutomatedIT extends TestNGCitrusTestRunner 
...

src/test/resources/application.properties

citrus.rest.server.port=7913
consumer.to=localhost:$citrus.rest.server.port/consumer

pom.xml spring sn-p

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>$spring-boot.version</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

我假设存在注释或文件结构问题,但我至今无法弄清楚是什么问题。

更新

在将文件重命名为application-test.properties 并更改pom.xml 中的spring-boot 插件后,我得到了要从src/main/resources 加载的测试属性:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>$spring-boot.version</version>
    <executions>
        <execution>
            <goals>
                <goal>repackage</goal>
            </goals>
        </execution>
        <execution>
            <id>pre-integration-test</id>
            <goals>
                <goal>start</goal>
            </goals>
            <configuration>
                <fork>true</fork>
                <profiles>test</profiles>
            </configuration>
        </execution>
        <execution>
            <id>post-integration-test</id>
            <goals>
                <goal>stop</goal>
            </goals>
        </execution>
    </executions>
</plugin>

通过在 POM 中将配置文件设置为 test,现在 Spring Boot 会加载测试属性。

这似乎不是正确的做法,这也限制了 application-test.properties 文件的使用仅限于主 Spring Boot 应用程序,而不是测试包。

【问题讨论】:

【参考方案1】:

您将这两个文件称为完全相同的东西,application.properties。这意味着只会读取具有最高优先级的单个文件;在这种情况下,它是您的src/test 中的那个。相反,使用 Spring 的配置文件功能将您的覆盖文件重命名为 src/test/resources/application-test.properties,这将允许 Boot 看到这两个文件并应用您想要的覆盖逻辑。

【讨论】:

我将@ActiveProfiles("test") 添加到src/test/java/CitrusTestsIT.java 并将src/test/resources 中的属性文件重命名为application-test.properties。日志显示配置文件已设置为测试,但未使用任何测试属性。 test 配置文件通常应该自动添加,我相信。检查您的控制台日志,它会告诉您正在使用哪些配置文件(以及哪些属性来源)。 如果我不包含注释,我会在日志中看到:No active profile set, falling back to default profiles: default 我设法从src/main/resources 文件夹中加载了application-test.properties 文件。查看我的更新。

以上是关于在 Citrus TestNG 测试期间 Spring Boot 未加载测试特定应用程序属性的主要内容,如果未能解决你的问题,请参考以下文章

在构建期间不执行测试

使用与黄瓜集成的柑橘框架的并行集成测试执行

TestNG 入门教程

接口测试小白的Testng学习之路

TestNG详解(单元测试框架)

testNG框架从入门到精通