We Are Going To Discuss About Spring-boot default profile for integration tests. So lets Start this Java Article.
Spring-boot default profile for integration tests
- Spring-boot default profile for integration tests
You can put your test specific properties into
src/test/resources/config/application.properties
.
The properties defined in this file will override those defined insrc/main/resources/application.properties
during testing. - Spring-boot default profile for integration tests
You can put your test specific properties into
src/test/resources/config/application.properties
.
The properties defined in this file will override those defined insrc/main/resources/application.properties
during testing.
Solution 1
Come 2021 and Spring Boot 2.4 the solution I have found is to have 3 properties files
src/main/resources/application.yml
– contains the application’s default propssrc/test/resources/application.yml
– sets the profile to ‘test’, and imports properties from ‘main’src/test/resources/application-test.yml
– contains test-specific profiles, which will override ‘main’
Here is the content of 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
For example, if src/main/resources/application.yml
has the content
ip-address: "10.7.0.1"
username: admin
and src/test/resources/application-test.yml
has
ip-address: "999.999.999.999"
run-integration-test: true
Then (assuming there are no other profiles)…
when running tests,
profiles=test
--
ip-address=999.999.999.999
username=admin
run-integration-test=true
and when running the application normally
profiles=none
--
ip-address=10.7.0.1
username=admin
run-integration-test <undefined>
Note: if src/main/resources/application.yml
contains spring.profiles.active: "dev"
, then this won’t be overwritten by src/test/resources/application-test.yml
Original Author aSemy Of This Content
Solution 2
You can put your test specific properties into src/test/resources/config/application.properties
.
The properties defined in this file will override those defined in src/main/resources/application.properties
during testing.
For more information on why this works have a look at Spring Boots docs.
Original Author Matze Of This Content
Solution 3
Another way to do this is to define a base (abstract) test class that your actual test classes will extend :
@RunWith(SpringRunner.class)
@SpringBootTest()
@ActiveProfiles("staging")
public abstract class BaseIntegrationTest {
}
Concrete test :
public class SampleSearchServiceTest extends BaseIntegrationTest{
@Inject
private SampleSearchService service;
@Test
public void shouldInjectService(){
assertThat(this.service).isNotNull();
}
}
This allows you to extract more than just the @ActiveProfiles
annotation. You could also imagine more specialised base classes for different kinds of integration tests, e.g. data access layer vs service layer, or for functional specialties (common @Before
or @After
methods etc).
Original Author Pierre Henry Of This Content
Solution 4
As far as I know there is nothing directly addressing your request – but I can suggest a proposal that could help:
You could use your own test annotation that is a meta annotation comprising @SpringBootTest
and @ActiveProfiles("test")
. So you still need the dedicated profile but avoid scattering the profile definition across all your test.
This annotation will default to the profile test
and you can override the profile using the meta annotation.
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@SpringBootTest
@ActiveProfiles
public @interface MyApplicationTest {
@AliasFor(annotation = ActiveProfiles.class, attribute = "profiles") String[] activeProfiles() default {"test"};
}
Original Author Mathias Dpunkt Of This Content
Conclusion
So This is all About This Tutorial. Hope This Tutorial Helped You. Thank You.