在测试

时间:2018-01-16 03:25:14

标签: java spring-boot maven-3

在春季启动Maven项目中,application.ymlsrc/main/resources分别有src/test/resources个文件。

运行测试用例时,似乎测试只会使用src/test/resources目录中的文件。它不会加载两个文件并覆盖src/main/resources/application.yml中的属性。 如果src/test/resources目录中没有该文件,它将使用src/main/resources目录中的文件。

Spring如何在这两个目录中加载application.yml文件?规则是什么?或者这个动作取决于什么?
我在哪里可以在线查找更多相关信息?

Example:

└───spring-boot-main-test-application-yaml
    ├───pom.xml
    └───src
        ├───main
        │   ├───java
        │   ├───resources
        │       ├───application.yml
        │   
        ├───test
            ├───java
            ├───resources
                └─── application.yml

src/main/resource/application.yml

name: Phil(main)
sample:
  name: Andy(main)

src/test/resource/application.yml

name: Phil(test)
sample:
  name: Andy(test)

案例1:src/main/resource/application.yml存在 输出:Hello Phil(主要),Andy(主要)

案例2:src/main/resource/application.ymlsrc/test/resource/application.yml都存在 输出:你好Phil(测试),Andy(测试)

案例3:src/main/resource/application.ymlsrc/test/resource/application.yml都存在并在name中注释src/test/resource/application.yml了 输出:
Error - java.lang.IllegalArgumentException: Could not resolve placeholder 'name' in value "${name}"

此测试似乎没有从src/main/resource/application.yml读取属性,因此找不到name属性。

2 个答案:

答案 0 :(得分:0)

Spring检测到这两个目录,就像你说它根据状态和优先级确定要使用哪些配置。如果你想让spring使用特定的设置,你应该定义spring profiles,它可以有专门的设置,也可以扩展默认设置。

答案 1 :(得分:0)

我正在使用yml文件,并确保在构建应用程序时加载了这些属性文件,因此在pom.xml中最好具有以下配置

<build>

        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.yml</include>
                    <include>**/*.jks</include>

                </includes>
            </resource>
        </resources>
        <testResources>
            <testResource>
                <directory>${project.basedir}/src/test/resources</directory>
            </testResource>
        </testResources>
 ....
</build>

确保运行生成文件(如果需要,请从头开始,例如删除.m2中的存储库文件夹-可能根本不需要)。现在检查target/classes,它应包含所有指定文件类型