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

时间:2016-09-25 18:05:55

标签: java spring spring-boot

Spring-boot使用Spring配置文件(http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html),它允许例如为不同的环境分别配置。 我使用此功能的一种方法是配置测试数据库以供集成测试使用。 我想知道是否有必要创建自己的个人资料' test'并在每个测试文件中明确激活此配置文件? 现在我用以下方式做到这一点:

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

    @ActiveProfiles("test")
    
  5. 是否有更聪明/更简洁的方式?例如,默认测试配置文件?

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

    有关

13 个答案:

答案 0 :(得分:61)

据我所知,没有任何内容可以直接解决您的请求 - 但我可以建议一个可以提供帮助的提案:

您可以使用自己的meta annotation测试注释,其中包含@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 :(得分:39)

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

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

答案 2 :(得分:27)

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

spring.profiles.active=test

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

答案 3 :(得分:5)

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

在测试过程中,此文件中定义的属性将覆盖src/main/resources/application.properties中定义的属性。

有关其工作原理的更多信息,请查看Spring Boots docs

答案 4 :(得分:4)

在我的情况下,我有不同的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" })注释这是负责选择我想要的application.properties的文件。我对这些测试的需求

答案 5 :(得分:2)

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

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

答案 6 :(得分:2)

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

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

这里是src/test/resources/application-test.yml的内容:

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

src/test/resources/application-test.yml

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

运行测试时,

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"

覆盖

答案 7 :(得分:1)

另一种编程方式:

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

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

效果很好。

答案 8 :(得分:1)

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

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

答案 9 :(得分:1)

我通常使用通用代码和注释为所有集成测试创建一个基类。不要忘记 make 它 abstract 以免安装。例如:

@SpringBootTest
@Transactional
@AutoConfigureMockMvc
@ActiveProfiles("test")
public abstract class AbstractControllerTest {

    @Autowired
    protected MockMvc mockMvc;

    protected ResultActions perform(MockHttpServletRequestBuilder builder) throws Exception {
        return mockMvc.perform(builder);
    }
}

// All annotations are inherited
class AccountControllerTest extends AbstractControllerTest {
....

答案 10 :(得分:0)

在application.properties文件中添加spring.profiles.active=tests,可以在Spring Boot应用程序中添加多个属性文件,例如application-stage.propertiesapplication-prod.properties等。您可以在应用程序中指定。属性文件,同时通过添加spring.profiles.active=stagespring.profiles.active=prod

进行引用

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

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

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

答案 11 :(得分:0)

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

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

答案 12 :(得分:0)

如果使用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”属性。