Expected behavior is that a multi-document properties file can be created with different sections separated by "#--- " characters, for each section applicable to a given active profile. This works as expected when using a file named application.properties
and allowing Spring Boot to bootstrap the application normally.
However, if the default application properties file is overridden in a JUnit test class annotated with a test property source (e.g. @TestPropertySource(locations="classpath:test.properties")
), Spring Boot ignores the active profiles and simply references the last value it finds for the property in the properties file.
I have created a sample Java project to demonstrate the issue here: https://github.com/peter-thomas-mgd/spring-multi-doc
The example shows how an identical properties file behaves differently when specified as a test property source called test.properties
vs. when bootstrapped as the default application.properties
.
Comment From: philwebb
This is a little annoying, but unfortunately @TestPropertySource
is part of the Spring Framework codebase and as such doesn't know anything about multi-document property files.
I'm not sure on the best way to fix this. We could document it as a limitation, or we could perhaps develop an alternative annotation. It's a tricky problem because there are other aspects (such as spring.config.import
) that also won't work.
In the meantime, you might want to look at @SpringBootTest
or SpringBootContextLoader
which uses SpringApplication
and so should load the full application.properties
file.
Comment From: peter-thomas-mgd
Thanks for responding so quickly. We have already implemented a workaround, which is using @SpringBootTest
exactly as you suggest, and moving our properties to application.properties
. However, I wanted to make sure this issue got on the radar, since I'm sure other teams are going to run into this issue at some point.