Load different application.yml in SpringBoot Test
I'm using a spring boot app which runs my src/main/resources/config/application.yml.
When I run my test case by :
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
@IntegrationTest
public class MyIntTest{
}
The test codes still run my application.yml file to load properties. I wonder if it is possible to run another *.yml file when running the test case.
Solution 1:
One option is to work with profiles. Create a file called application-test.yml, move all properties you need for those tests to that file and then add the @ActiveProfiles
annotation to your test class:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
@IntegrationTest
@ActiveProfiles("test") // Like this
public class MyIntTest{
}
Be aware, it will additionally load the application-test.yml, so all properties that are in application.yml are still going to be applied as well. If you don't want that, either use a profile for those as well, or override them in your application-test.yml.
Solution 2:
You can set your test properties in src/test/resources/config/application.yml
file. Spring Boot test cases will take properties from application.yml
file in test directory.
The config
folder is predefined in Spring Boot.
As per documentation:
If you do not like application.properties as the configuration file name, you can switch to another file name by specifying a spring.config.name environment property. You can also refer to an explicit location by using the spring.config.location environment property (which is a comma-separated list of directory locations or file paths). The following example shows how to specify a different file name:
java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties
The same works for application.yml
Documentation:
https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-external-config-application-property-files
https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-application-property-files
Solution 3:
You can use @TestPropertySource
to load different properties/yaml file
@TestPropertySource(locations="classpath:test.properties")
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(Application.class)
public class MyIntTest{
}
OR if you want to override only specific properties/yaml you can use
@TestPropertySource(
properties = {
"spring.jpa.hibernate.ddl-auto=validate",
"liquibase.enabled=false"
}
)
Solution 4:
If you need to have production application.yml
completely replaced then put its test version to the same path but in test environment (usually it is src/test/resources/
)
But if you need to override or add some properties then you have few options.
Option 1: put test application.yml
in src/test/resources/config/
directory as @TheKojuEffect suggests in his answer.
Option 2: use profile-specific properties: create say application-test.yml
in your src/test/resources/
folder and:
-
add
@ActiveProfiles
annotation to your test classes:@SpringBootTest(classes = Application.class) @ActiveProfiles("test") public class MyIntTest {
-
or alternatively set
spring.profiles.active
property value in@SpringBootTest
annotation:@SpringBootTest( properties = ["spring.profiles.active=test"], classes = Application.class, ) public class MyIntTest {
This works not only with @SpringBootTest
but with @JsonTest
, @JdbcTests
, @DataJpaTest
and other slice test annotations as well.
And you can set as many profiles as you want (spring.profiles.active=dev,hsqldb
) - see farther details in documentation on Profiles.