The @ContextConfiguration annotation is a core part of the Spring TestContext Framework and is used to define how the Spring ApplicationContext should be loaded for a test. It provides configuration metadata to the TestContext infrastructure, allowing tests to be executed against a specifically tailored Spring context. This annotation can be used independently or in combination with other Spring testing annotations.
Definition of ContextConfigurationVersion: 7.0.3 package org.springframework.test.context;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface ContextConfiguration {
@AliasFor("locations")
String[] value() default {}; 1
@AliasFor("value")
String[] locations() default {}; 2
Class<?>[] classes() default {}; 3
Class<? extends ApplicationContextInitializer<?>>[] initializers()
default {}; 4
boolean inheritLocations() default true; 5
boolean inheritInitializers() default true; 6
Class<? extends ContextLoader> loader()
default ContextLoader.class; 7
String name() default ""; 8
}
Basic Use Cases of @ContextConfiguration
Here are the essential use cases for basic Spring Core tutorials.
1. Simple Java Configuration (Most Common Use Case)
Modern Spring applications primarily use Java-based configuration. This is the most important pattern to learn:
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = AppConfig.class)
public class BasicServiceTest {
@Autowired
private UserService userService;
@Test
public void testUserService() {
// Test logic here
}
}
2. Multiple Configuration Classes
When your application configuration is split across multiple classes:
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = {
DataSourceConfig.class,
ServiceConfig.class,
SecurityConfig.class
})
public class IntegrationTest {
// Combines multiple configuration classes
}
3. XML Configuration (Legacy Support)
For projects still using XML configuration, or for compatibility with legacy systems:
@ExtendWith(SpringExtension.class)
@ContextConfiguration("/applicationContext.xml")
public class XmlConfigTest {
// Loads configuration from XML file
}
@ExtendWith(SpringExtension.class)
@ContextConfiguration(locations = {
"/services-config.xml",
"/daos-config.xml"
})
public class MultipleXmlConfigTest {
// Combines multiple XML configuration files
}
4. Test Inheritance Basics
Creating a base test class with common configuration that child tests can inherit:
// Base test class with common configuration
@ContextConfiguration(classes = BaseTestConfig.class)
public abstract class BaseIntegrationTest {
// Common setup and utilities
}
// Child class inherits configuration automatically
@ExtendWith(SpringExtension.class)
public class UserServiceTest extends BaseIntegrationTest {
@Autowired
private UserService userService;
@Test
public void testFindUser() {
// Inherits configuration from BaseIntegrationTest
// Can add additional configuration if needed
}
}
5. Adding Specific Configuration in Child Classes
Child classes can add their own configuration while inheriting from the parent:
// Child class with additional configuration
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = AdditionalConfig.class)
public class SpecializedTest extends BaseIntegrationTest {
// Configuration includes:
// 1. BaseTestConfig.class (inherited)
// 2. AdditionalConfig.class (added)
}
6. Using Component Classes Directly
You can specify component classes directly without @Configuration classes:
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = {
UserService.class, // @Service component
UserRepository.class // @Repository component
})
public class ComponentTest {
// Direct component registration for simple tests
}
Advanced features like custom initializers, context loaders, and context caching will be covered in separate intermediate or advanced tutorials.
Example
GreetingService
package com.logicbig.example;
import org.springframework.stereotype.Service;
@Service
public class GreetingService {
public String greet() {
return "Hello, World!";
}
}
GreetingService2
package com.logicbig.example;
import org.springframework.stereotype.Service;
@Service
public class GreetingService2 {
public String greet() {
return "Hello, World2!";
}
}
GreetingServiceTest
This test we are using component classes directly.
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.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
import static org.junit.jupiter.api.Assertions.assertEquals;
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = {GreetingService.class, GreetingService2.class})
class GreetingServiceTest {
@Autowired
GreetingService greetingService;
@Autowired
GreetingService2 greetingService2;
@Test
void testGreet() {
assertEquals("Hello, World!", greetingService.greet());
}
@Test
void testGreet2() {
assertEquals("Hello, World2!", greetingService2.greet());
}
}
D:\example-projects\spring-core-testing\spring-test-context-configuration-example>mvn test -Dtest=GreetingServiceTest [INFO] Scanning for projects... [INFO] [INFO] ---< com.logicbig.example:spring-test-context-configuration-example >--- [INFO] Building spring-test-context-configuration-example 1.0-SNAPSHOT [INFO] from pom.xml [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- resources:3.3.1:resources (default-resources) @ spring-test-context-configuration-example --- [INFO] skip non existing resourceDirectory D:\example-projects\spring-core-testing\spring-test-context-configuration-example\src\main\resources [INFO] [INFO] --- compiler:3.14.1:compile (default-compile) @ spring-test-context-configuration-example --- [INFO] Recompiling the module because of added or removed source files. [INFO] Compiling 2 source files with javac [debug target 25] to target\classes [INFO] [INFO] --- resources:3.3.1:testResources (default-testResources) @ spring-test-context-configuration-example --- [INFO] skip non existing resourceDirectory D:\example-projects\spring-core-testing\spring-test-context-configuration-example\src\test\resources [INFO] [INFO] --- compiler:3.14.1:testCompile (default-testCompile) @ spring-test-context-configuration-example --- [INFO] Recompiling the module because of changed dependency. [INFO] Compiling 1 source file with javac [debug target 25] to target\test-classes [INFO] [INFO] --- surefire:3.2.5:test (default-test) @ spring-test-context-configuration-example --- [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.GreetingServiceTest [INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.208 s -- in com.logicbig.example.GreetingServiceTest [INFO] [INFO] Results: [INFO] [INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0 [INFO] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 2.073 s [INFO] Finished at: 2026-01-30T11:57:54+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
|