用于集成测试的Spring-boot默认配置文件


93

Spring-boot利用了Spring配置文件(http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html),这些配置文件例如允许针对不同的环境进行单独的配置。我使用此功能的一种方法是配置要由集成测试使用的测试数据库。但是我想知道是否有必要创建自己的配置文件“测试”并在每个测试文件中显式激活此配置文件吗?现在,我通过以下方式进行操作:

  1. 在src / main / resources内创建application-test.properties
  2. 将测试特定的配置写在那里(现在只是数据库名称)
  3. 在每个测试文件中包括:

    @ActiveProfiles("test")
    

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

编辑1:此问题与Spring-Boot 1.4.1有关

Answers:


93

据我所知,没有什么可以直接解决您的请求-但我可以提出一项建议,可以帮助您:

您可以使用自己的测试注释,该注释是包含@SpringBootTest和的元注释@ActiveProfiles("test")。因此,您仍然需要专用的配置文件,但要避免在所有测试中分散配置文件定义。

该注释将默认为配置文件test,您可以使用元注释覆盖配置文件。

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

1
如何使用它来声明注释要使用的多个活动配置文件?
payne

简单整洁的修复程序。
Vignesh

53

执行此操作的另一种方法是定义您的实际测试类将扩展的基础(抽象)测试类:

@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方法等)。


42

您可以将application.properties文件放在test / resources文件夹中。在那里设置

spring.profiles.active=test

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


如果要避免设置@ActiveProfiles(“ test”),可以在测试用例中使用此条目。它对您不起作用吗?
Compito

34
如果创建src/test/resources/application.properties文件,src/main/resources/application.properties则在运行测试时将忽略内容。
ciastek

6
@ciastek您可以添加application-test.properties测试并仅覆盖所需的属性。
Advicer

3
@Advicer除非默认属性spring.profiles.active=test如答案所述那样指定,否则不会被拾取。
OrangeDog

4
完全是@OrangeDog-也许您可以使用默认情况下处于活动状态的配置文件“默认”。因此,您可以在test / resources / application-default.properties中添加这样的行(除非您当然已经有了src / main / application-default.properties文件:-)
joensson

15

这样做的一种相对方式(实际上,距离@Compito的原始答案还不到一个星期):

  1. 设置spring.profiles.active=testtest/resources/application-default.properties
  2. 添加test/resources/application-test.properties测试并仅覆盖所需的属性。

2
这是否也意味着application.properties将解析类路径中的默认值,然后解析,test/resources/application-default.properties然后,由于检测到配置文件“ test”,也解析了该路径test/resources/application-test.properties?否则它将无法解决@ciastek的问题,如@Compito的答案中所述
anddero

8

如果使用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应该使用此参数运行集成测试(* IT.java),并且IntelliJ也会在激活此配置文件的情况下开始-因此,您可以在其中指定所有属性

application-test.yml

并且您不需要“ -default”属性。


为我工作,但也必须将配置添加到surefire插件以及故障保护。
Mohammed Atif

5

就我而言,根据环境,我有不同的application.properties,例如:

application.properties (base file)
application-dev.properties
application-qa.properties
application-prod.properties

和application.properties包含属性spring.profiles.active以选择适当的文件。

对于我的集成测试,我在application-test.properties内部创建了一个新文件,test/resources并带有@TestPropertySource({ "/application-test.properties" })注释,该文件负责选择应用程序。我想要的属性取决于这些测试的需求


您应该使用@ActiveProfiles,而不是@TestPropertySource
OrangeDog

我认为它不介意使用@TestPropertiesSource。这也是在概要文件测试配置之间加载配置的方式。
soyphea

5

要激活“测试”配置文件,请在build.gradle中写入:

    test.doFirst {
        systemProperty 'spring.profiles.active', 'test'
        activeProfiles = 'test'
    }

4

另一种编程方式可以做到这一点:

  import static org.springframework.core.env.AbstractEnvironment.DEFAULT_PROFILES_PROPERTY_NAME;

  @BeforeClass
  public static void setupTest() {
    System.setProperty(DEFAULT_PROFILES_PROPERTY_NAME, "test");
  }

效果很好。


4

您可以将特定于测试的属性放入中src/test/resources/config/application.properties

此文件中定义的属性将覆盖src/main/resources/application.properties测试期间定义的属性。

有关为何可行的更多信息,请参阅Spring Boots docs


这里有许多好主意,对许多情况有用。IMHO @Matze答案是该问题最简洁明了的答案,无需配置文件,无需修改测试代码...日志记录也更简洁(在我的情况下,Spring使用方言记录日志令人困惑:org.hibernate.dialect.PostgreSQL93Dialect幸运的是,当我的测试是使用测试H2数据库时)。
雷蒙德·纳西夫

1

如果您只是想在通过maven进行构建时设置/使用默认配置文件,则传递参数, -Dspring.profiles.active=test 就像

mvn全新安装-Dspring.profiles.active = dev


0

添加spring.profiles.active=tests在您的application.properties文件,你可以在你喜欢春天启动的应用程序添加多个属性文件 application-stage.propertiesapplication-prod.properties等等。你可以在你的application.properties指定文件,而文件中加入参考spring.profiles.active=stagespring.profiles.active=prod

您还可以通过提供以下命令在运行spring boot应用程序时传递配置文件:

java -jar-Dspring.profiles.active=localbuild/libs/turtle-rnr-0.0.1-SNAPSHOT.jar

根据配置文件名称选择属性文件,在上述情况下,通过配置文件local考虑该application-local.properties文件

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.