Close

Spring Core Testing - @ContextConfiguration Annotation

[Last Updated: Feb 2, 2026]

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 ContextConfiguration

Version: 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
 }
1Alias for #locations. (Since 3.0)
2The resource locations to use for loading an org.springframework.context.ApplicationContext. (Since 2.5)
3The component classes to use for loading an org.springframework.context.ApplicationContext. (Since 3.1)
4The application context initializer classes to use for initializing a ConfigurableApplicationContext. (Since 3.2)
5Whether #locations or #classes from test superclasses and enclosing classes should be inherited. (Since 2.5)
6Whether #initializers from test superclasses and enclosing classes should be inherited. (Since 3.2)
7The type of SmartContextLoader (or ContextLoader) to use for loading an org.springframework.context.ApplicationContext. (Since 2.5)
8The name of the context hierarchy level represented by this configuration. (Since 3.2.2)

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 Project

Dependencies and Technologies Used:

  • spring-context 7.0.3 (Spring Context)
     Version Compatibility: 5.0.0.RELEASE - 7.0.3Version List
    ×

    Version compatibilities of spring-context with this example:

    • 5.0.0.RELEASE
    • 5.0.1.RELEASE
    • 5.0.2.RELEASE
    • 5.0.3.RELEASE
    • 5.0.4.RELEASE
    • 5.0.5.RELEASE
    • 5.0.6.RELEASE
    • 5.0.7.RELEASE
    • 5.0.8.RELEASE
    • 5.0.9.RELEASE
    • 5.0.10.RELEASE
    • 5.0.11.RELEASE
    • 5.0.12.RELEASE
    • 5.0.13.RELEASE
    • 5.0.14.RELEASE
    • 5.0.15.RELEASE
    • 5.0.16.RELEASE
    • 5.0.17.RELEASE
    • 5.0.18.RELEASE
    • 5.0.19.RELEASE
    • 5.0.20.RELEASE
    • 5.1.0.RELEASE
    • 5.1.1.RELEASE
    • 5.1.2.RELEASE
    • 5.1.3.RELEASE
    • 5.1.4.RELEASE
    • 5.1.5.RELEASE
    • 5.1.6.RELEASE
    • 5.1.7.RELEASE
    • 5.1.8.RELEASE
    • 5.1.9.RELEASE
    • 5.1.10.RELEASE
    • 5.1.11.RELEASE
    • 5.1.12.RELEASE
    • 5.1.13.RELEASE
    • 5.1.14.RELEASE
    • 5.1.15.RELEASE
    • 5.1.16.RELEASE
    • 5.1.17.RELEASE
    • 5.1.18.RELEASE
    • 5.1.19.RELEASE
    • 5.1.20.RELEASE
    • 5.2.0.RELEASE
    • 5.2.1.RELEASE
    • 5.2.2.RELEASE
    • 5.2.3.RELEASE
    • 5.2.4.RELEASE
    • 5.2.5.RELEASE
    • 5.2.6.RELEASE
    • 5.2.7.RELEASE
    • 5.2.8.RELEASE
    • 5.2.9.RELEASE
    • 5.2.10.RELEASE
    • 5.2.11.RELEASE
    • 5.2.12.RELEASE
    • 5.2.13.RELEASE
    • 5.2.14.RELEASE
    • 5.2.15.RELEASE
    • 5.2.16.RELEASE
    • 5.2.17.RELEASE
    • 5.2.18.RELEASE
    • 5.2.19.RELEASE
    • 5.2.20.RELEASE
    • 5.2.21.RELEASE
    • 5.2.22.RELEASE
    • 5.2.23.RELEASE
    • 5.2.24.RELEASE
    • 5.2.25.RELEASE
    • 5.3.0
    • 5.3.1
    • 5.3.2
    • 5.3.3
    • 5.3.4
    • 5.3.5
    • 5.3.6
    • 5.3.7
    • 5.3.8
    • 5.3.9
    • 5.3.10
    • 5.3.11
    • 5.3.12
    • 5.3.13
    • 5.3.14
    • 5.3.15
    • 5.3.16
    • 5.3.17
    • 5.3.18
    • 5.3.19
    • 5.3.20
    • 5.3.21
    • 5.3.22
    • 5.3.23
    • 5.3.24
    • 5.3.25
    • 5.3.26
    • 5.3.27
    • 5.3.28
    • 5.3.29
    • 5.3.30
    • 5.3.31
    • 5.3.32
    • 5.3.33
    • 5.3.34
    • 5.3.35
    • 5.3.36
    • 5.3.37
    • 5.3.38
    • 5.3.39
    • Compatible Java Version: 17+
    • 6.0.0
    • 6.0.1
    • 6.0.2
    • 6.0.3
    • 6.0.4
    • 6.0.5
    • 6.0.6
    • 6.0.7
    • 6.0.8
    • 6.0.9
    • 6.0.10
    • 6.0.11
    • 6.0.12
    • 6.0.13
    • 6.0.14
    • 6.0.15
    • 6.0.16
    • 6.0.17
    • 6.0.18
    • 6.0.19
    • 6.0.20
    • 6.0.21
    • 6.0.22
    • 6.0.23
    • 6.1.0
    • 6.1.1
    • 6.1.2
    • 6.1.3
    • 6.1.4
    • 6.1.5
    • 6.1.6
    • 6.1.7
    • 6.1.8
    • 6.1.9
    • 6.1.10
    • 6.1.11
    • 6.1.12
    • 6.1.13
    • 6.1.14
    • 6.1.15
    • 6.1.16
    • 6.1.17
    • 6.1.18
    • 6.1.19
    • 6.1.20
    • 6.1.21
    • 6.2.0
    • 6.2.1
    • 6.2.2
    • 6.2.3
    • 6.2.4
    • 6.2.5
    • 6.2.6
    • 6.2.7
    • 6.2.8
    • 6.2.9
    • 6.2.10
    • 6.2.11
    • 6.2.12
    • 6.2.13
    • 6.2.14
    • 6.2.15
    • 7.0.0
    • 7.0.1
    • 7.0.2
    • 7.0.3

    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

spring-core-testing - @ContextConfiguration Annotation Select All Download
  • spring-test-context-configuration-example
    • src
      • main
        • java
          • com
            • logicbig
              • example
      • test
        • java
          • com
            • logicbig
              • example
                • GreetingServiceTest.java

    See Also

    Join