#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, поэтому, я думаю, в этом не должно быть необходимости