Spring-boot使用Spring配置文件(http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html),它允许例如为不同的环境分别配置。 我使用此功能的一种方法是配置测试数据库以供集成测试使用。 我想知道是否有必要创建自己的个人资料' test'并在每个测试文件中明确激活此配置文件? 现在我用以下方式做到这一点:
在每个测试文件中都包含:
@ActiveProfiles("test")
是否有更聪明/更简洁的方式?例如,默认测试配置文件?
编辑1:这个问题与Spring-Boot 1.4.1
有关答案 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的原始答案只有一个星期):
spring.profiles.active=test
中设置test/resources/application-default.properties
。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.properties
,application-prod.properties
等。您可以在应用程序中指定。属性文件,同时通过添加spring.profiles.active=stage
或spring.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”属性。