This example demonstrates how to use @TestPropertySource. It is a class-level annotation that is used to specify which properties files should be loaded when running the test class.
Test property sources have the highest precedence than all other properties sources. That means Test source will override all other properties.
Definition of TestPropertySourceVersion: 6.2.13 package org.springframework.test.context;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Repeatable(TestPropertySources.class)
public @interface TestPropertySource {
@AliasFor("locations")
String[] value() default {}; 1
@AliasFor("value")
String[] locations() default {}; 2
boolean inheritLocations() default true; 3
String[] properties() default {}; 4
boolean inheritProperties() default true; 5
String encoding() default ""; 6
Class<? extends PropertySourceFactory> factory()
default PropertySourceFactory.class; 7
}
Example
Creating a Spring application
package com.logicbig.example;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
@Service
public class ReportService {
@Value("${report-subscriber:admin@example.com}")
private String theSubscriber;
public String getReportSubscriber() {
return theSubscriber;
}
}
In above example we used @Value annotation, if you are not familiar with it please check out this tutorial.
src/main/resources/prod.propertiesreport-subscriber=theManager@example.com
app-name=Subscriber App
Main class
package com.logicbig.example;
import org.springframework.context.annotation.*;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
@PropertySource("classpath:prod.properties")
@Configuration
@ComponentScan
public class AppConfig {
@Bean
public static PropertySourcesPlaceholderConfigurer propertyConfigInDev() {
return new PropertySourcesPlaceholderConfigurer();
}
public static void main(String[] args) {
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(AppConfig.class);
ReportService rs = context.getBean(ReportService.class);
System.out.println(rs.getReportSubscriber());
}
}OutputtheManager@example.com
In above example we used @PropertySource, if you are not familiar with it please check out this tutorial.
Also we registered PropertySourcesPlaceholderConfigurer in above example. This bean resolves ${...} placeholders within bean definition property values and @Value annotations against the current Spring Environment and its set of PropertySources
Test Folder
The following property file has higher precedence than the one added in application folder (prod.properties)
src/main/resources/src/test/resources/test.propertiesreport-subscriber=theDeveloper@example.com
tests-name=Subscriber Tests
JUnit Test
package com.logicbig.example;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.AbstractEnvironment;
import org.springframework.core.env.EnumerablePropertySource;
import org.springframework.core.env.Environment;
import org.springframework.core.env.MutablePropertySources;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import static org.junit.jupiter.api.Assertions.assertEquals;
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = AppConfig.class)
@TestPropertySource("classpath:test.properties")
public class ReportServiceTests {
@Autowired
private ReportService reportService;
@Autowired
private Environment environment;
@Test
public void testReportSubscriber() {
String s = reportService.getReportSubscriber();
System.out.println(s);
assertEquals("theDeveloper@example.com", s);
}
@Test
public void testAllProps(){
//accessing properties directly
String subscriber = environment.getProperty("report-subscriber");
assertEquals("theDeveloper@example.com", subscriber);
String appName = environment.getProperty("app-name");
assertEquals("Subscriber App", appName);
String testsName = environment.getProperty("tests-name");
assertEquals("Subscriber Tests", testsName);
}
}
Output$ mvn test -Dtest=ReportServiceTests [INFO] Scanning for projects... [INFO] [INFO] --------< com.logicbig.example:test-property-source-annotation >-------- [INFO] Building test-property-source-annotation 1.0-SNAPSHOT [INFO] from pom.xml [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- resources:3.3.1:resources (default-resources) @ test-property-source-annotation --- [WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent! [INFO] Copying 1 resource from src\main\resources to target\classes [INFO] [INFO] --- compiler:3.3:compile (default-compile) @ test-property-source-annotation --- [INFO] Changes detected - recompiling the module! [WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent! [INFO] Compiling 2 source files to D:\example-projects\spring-core-testing\test-property-source-annotation\target\classes [INFO] [INFO] --- resources:3.3.1:testResources (default-testResources) @ test-property-source-annotation --- [WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent! [INFO] Copying 1 resource from src\test\resources to target\test-classes [INFO] [INFO] --- compiler:3.3:testCompile (default-testCompile) @ test-property-source-annotation --- [INFO] Changes detected - recompiling the module! [WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent! [INFO] Compiling 1 source file to D:\example-projects\spring-core-testing\test-property-source-annotation\target\test-classes [INFO] [INFO] --- surefire:3.2.5:test (default-test) @ test-property-source-annotation --- [INFO] Using auto detected provider org.apache.maven.surefire.junitplatform.JUnitPlatformProvider [WARNING] file.encoding cannot be set as system property, use <argLine>-Dfile.encoding=...</argLine> instead [INFO] [INFO] ------------------------------------------------------- [INFO] T E S T S [INFO] ------------------------------------------------------- [INFO] Running com.logicbig.example.ReportServiceTests theDeveloper@example.com [INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.369 s -- in com.logicbig.example.ReportServiceTests [INFO] [INFO] Results: [INFO] [INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0 [INFO] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 2.650 s [INFO] Finished at: 2026-01-31T10:26:08+08:00 [INFO] ------------------------------------------------------------------------
Example ProjectDependencies and Technologies Used: - spring-context 7.0.3 (Spring Context)
Version Compatibility: 5.0.0.RELEASE - 7.0.3 Version compatibilities of spring-context with this example: Versions in green have been tested.
- spring-test 7.0.3 (Spring TestContext Framework)
- junit-jupiter-engine 6.0.2 (Module "junit-jupiter-engine" of JUnit)
- JDK 25
- Maven 3.9.11
|