Skip to content

@Configuration class in enclosing class is no longer discovered for @Nested test class  #35880

@nilshartmann

Description

@nilshartmann

Hi,

I have a test class annotated with @SpringBootTest that uses a static inner @TestConfigurationclass to override a bean in the application context:

@SpringBootTest
class DefaultHelloServiceTest {

    @TestConfiguration
    static class MyTestConfiguration {

        @Bean
        @Primary
        HelloService helloService() {
            var helloService = new HelloService("Spring");
            return helloService;
        }
    }

   // ...
}

In Spring Boot 3.5.x MyTestConfiguration is evaluated even for tests in my test class, that are @Nested JUnit test classes:

@SpringBootTest
class DefaultHelloServiceTest {
    // ... as above

    @Nested
    class TestBean {
        @Test
        void test_bean_nested() {
            // ✅ WORKS in Spring Boot 3.5.x
            // helloService is from MyTestConfiguration
            assertEquals("Spring", helloService.getGreeting());
        }
    }
}

In Spring Boot 4 this does not work anymore. The MyTestConfiguration.helloService-Method is only called when a test method is executed, that is not inside a @Nested test class. Instead of my customized service the "normal" one from the application context is injected.

(When adding an explicit @Import(DefaultHelloServiceTest.MyTestConfiguration.class) to the test class, it also works in both Spring Boot versions)

I have created a repository with two simple projects (3.5.7 and 4.0.0) that reproduces the behaviour.

The two test classes:

Not sure what the correct behaviour is and if I'm doing something wrong here, but for me it seems, that the behaviour has changed.

Metadata

Metadata

Assignees

Labels

in: testIssues in the test moduletype: regressionA bug that is also a regression

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions