Автоматически подключенная среда Spring равна нулю при настройке для теста junit

#spring #junit #properties #configuration #environment

#spring #junit #свойства #конфигурация #Окружающая среда

Вопрос:

Я пытаюсь настроить источник данных h2 для тестирования junit, используя конфигурацию Spring Java и загружая свойства из внешнего файла. Следуя руководствам и используя @PropertySource и автоматически подключая среду, я обнаружил, что при создании источника данных среда имеет значение null. Кто-нибудь знает, почему среда имеет значение null при сборке компонента Datasource?

Я создал фиктивный тестовый класс с ContextConfiguration, указывающий на класс @Configuration, где я определяю компоненты, необходимые для подключения к базе данных. Для их создания я просто хочу использовать файл внешних свойств, поэтому я использовал @PropertySource, указывающий на файл, и использовать среду, которая должна быть заполнена этими свойствами. Когда я пытаюсь получить доступ к любому свойству среды, происходит сбой, потому что среда равна null.

Я также попытался создать PropertySourcePlaceHolder и заполнить с помощью @Value, но с тем же результатом (свойство не заполнено).

Если мой класс конфигурации реализует интерфейс EnvironmentAware, фактически он заполняет среду для моего компонента datasource, так что это работает таким образом.

Я также протестировал то же самое без создания какого-либо компонента базы данных и просто создал фиктивный компонент, который просто печатает свойство среды при создании, и я обнаружил ту же проблему (среда равна нулю).

Я полагаю, что должно быть что-то с порядком инициализации spring, я не могу понять, почему это не работает, потому что все примеры определяют компоненты так, как я пытаюсь.

 //TEST CLASS
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes= {DataBaseTestConfiguration.class} , loader = AnnotationConfigContextLoader.class)
public class TestConfiguracion {
//Dummy
    @Test
    public void testPrueba(){
        assertEquals(1,1);
    }
}
  

Мой класс конфигурации

 //CONFIGURATION CLASS
@Configuration
@PropertySource("classpath:application-test.properties")
@EnableJpaRepositories(basePackages = "es.bla.springmvcexample")
@EnableTransactionManagement
public class DataBaseTestConfiguration {

  @Autowired
  private Environment environment;

  @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        System.out.println(environment); //<-- here is showing environment is null

        dataSource.setDriverClassName(environment.getProperty("jdbc.driverClassName")); //<-- Here fails
        dataSource.setUrl(environment.getProperty("jdbc.url"));
        dataSource.setUsername(environment.getProperty("jdbc.user"));
        dataSource.setPassword(environment.getProperty("jdbc.pass"));

        return dataSource;
    }

 ....

}
  

Кто-нибудь может объяснить мне, почему среда не вводится при создании компонентов?

РЕДАКТИРОВАТЬ: я создал другую @Configuration (PropertiesConfiguration), где я определяю @PropertiesSource и изменяю @ContextConfiguration, чтобы добавить этот класс конфигурации. Затем я изменил DataBaseTestConfiguration и отправил inject в @Enviroment, и это работает. Добавление фиктивного компонента в PropertiesConfiguration и попытка автоматического подключения среды в этом классе для заполнения этого компонента завершается с той же ошибкой. Это похоже на то, что я не мог бы автоматически подключать среду в классе конфигурации, где она определена (но я не понимаю, почему класс, в котором определен, имеет значение)

Комментарии:

1. Где ваша аннотация @ComponentScan?

2. Нет componentscan, потому что компонент определен в классе с помощью @configuration, поэтому, я думаю, в этом не должно быть необходимости