有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

用于集成测试的java Springboot默认配置文件

SpringBoot利用了Spring profiles,例如,它允许对不同的环境进行单独的配置。 我使用此功能的一种方法是配置集成测试使用的测试数据库。 我想知道是否有必要创建自己的配置文件“test”,并在每个测试文件中显式激活此配置文件? 现在我用以下方法来做:

  1. 创建应用程序测试。src/main/resources中的属性

  2. 在那里编写特定于测试的配置(现在只需数据库名称)

  3. 在每个测试文件中,包括:

    @ActiveProfiles("test")
    

有没有更聪明/更简洁的方法?例如,默认测试配置文件

编辑1:这个问题与Spring Boot 1.4.1有关


共 (6) 个答案

  1. # 1 楼答案

    如果您使用maven,可以将其添加到pom中。xml:

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-failsafe-plugin</artifactId>
                <configuration>
                    <argLine>-Dspring.profiles.active=test</argLine>
                </configuration>
            </plugin>
            ...
    

    然后,maven应该使用这个arugument运行您的集成测试(*IT.java),IntelliJ也将从激活这个概要文件开始,这样您就可以指定其中的所有属性

    application-test.yml
    

    您不应该需要“-default”属性

  2. # 2 楼答案

    这样做的一种方式(事实上,与@Compito的原始答案相比有点小差距):

    1. test/resources/application-default.properties中设置spring.profiles.active=test
    2. 为测试添加test/resources/application-test.properties,并仅覆盖所需的属性
  3. # 3 楼答案

    你可以提出申请。测试/资源文件夹中的属性文件。你准备好了

    spring.profiles.active=test
    

    这是运行测试时的一种默认测试配置文件

  4. # 4 楼答案

    到2021和Spring Bug 2.4,我发现的解决方案是有3个属性文件

    • src/main/resources/application.yml-包含应用程序的默认道具
    • src/test/resources/application.yml-将配置文件设置为“test”,并从“main”导入属性
    • src/test/resources/application-test.yml-包含特定于测试的配置文件,它将覆盖“main”

    以下是src/test/resources/application.yml的内容:

    # for testing, set default profile to 'test'
    spring.profiles.active: "test"
    # and import the 'main' properties
    spring.config.import: file:src/main/resources/application.yml
    

    例如,如果src/main/resources/application.yml具有

    ip-address: "10.7.0.1"
    username: admin
    

    而且{}已经

    ip-address: "999.999.999.999"
    run-integration-test: true
    

    然后(假设没有其他配置文件)

    运行测试时

    profiles=test
    --
    ip-address=999.999.999.999
    username=admin
    run-integration-test=true
    

    以及在正常运行应用程序时

    profiles=none
    --
    ip-address=10.7.0.1
    username=admin
    run-integration-test <undefined>
    

    注意:如果src/main/resources/application.yml包含spring.profiles.active: "dev",则不会被src/test/resources/application-test.yml覆盖

  5. # 5 楼答案

    另一种方法是定义实际测试类将扩展的基本(抽象)测试类:

    @RunWith(SpringRunner.class)
    @SpringBootTest()
    @ActiveProfiles("staging")
    public abstract class BaseIntegrationTest {
    }
    

    混凝土试验:

    public class SampleSearchServiceTest extends BaseIntegrationTest{
    
        @Inject
        private SampleSearchService service;
    
        @Test
        public void shouldInjectService(){
            assertThat(this.service).isNotNull();
        }
    } 
    

    这允许您提取的不仅仅是@ActiveProfiles注释。您还可以为不同类型的集成测试想象更专业的基类,例如数据访问层与服务层,或功能性专业(通用@Before@After方法等)

  6. # 6 楼答案

    据我所知,没有任何东西可以直接满足您的要求,但我可以提出一个有助于:

    您可以使用自己的测试注释,它是由@SpringBootTest@ActiveProfiles("test")组成的meta annotation。因此,您仍然需要专用的概要文件,但避免将概要文件定义分散到所有测试中

    此注释将默认为概要文件test,您可以使用元注释覆盖概要文件

    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.TYPE)
    @SpringBootTest
    @ActiveProfiles
    public @interface MyApplicationTest {
      @AliasFor(annotation = ActiveProfiles.class, attribute = "profiles") String[] activeProfiles() default {"test"};
    }