10

I have a ConfigurationProperties class and want to test it using junit. But the object is always null. What might be missing in the following code?

@EnableAutoConfiguration
@ComponentScan
@EnableConfigurationProperties(MyProperties.class)
public class AppConfig {

}

@Service
public class MyService {
    @Autowired
    private MyProperties props;

    public void run() {
        props.getName();
    }
}

@Component
@ConfigurationProperties(prefix = "my")
public class MyProperties {
    private String name;
    //getter,setter
}

application.properties:

my.name=test

test:

@Configuration
@ComponentScan(basePackageClasses = {MyService.class,  MyProperties.class},
            includeFilters = @ComponentScan.Filter(value = {MyService.class,  MyProperties.class},
            type = FilterType.ASSIGNABLE_TYPE),
            lazyInit = true
)
@PropertySources(
        @PropertySource("application.properties")
    )
class AppTest {
    @Bean
    public static PropertySourcesPlaceholderConfigurer propertiesResolver() {
        return new PropertySourcesPlaceholderConfigurer();
    }
}

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = ApplicationConfigTest.class)
public class MyTest extends AbstractJUnit4SpringContextTests {
    @Autowired
    private MyService service;

    @Test
    public void testService() {
        service.run();
    }
}
Jan Galinski
  • 11,768
  • 8
  • 54
  • 77
membersound
  • 81,582
  • 193
  • 585
  • 1,120

1 Answers1

14

The following will load it for you:

@ContextConfiguration(classes = Application.class, initializers = ConfigFileApplicationContextInitializer.class)
Mikael Vandmo
  • 887
  • 8
  • 14
  • 3
    In current Spring Boot versions `ConfigFileApplicationContextInitializer` is deprecated, but in docs they said that we should use `ConfigDataApplicationContextInitializer` instead. – luke Dec 29 '20 at 15:00