Среда автоматического подключения Spring при установке конфигурации для теста junit не имеет значения - PullRequest
0 голосов
/ 06 апреля 2019

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

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

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

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

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

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

//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;
    }

 ....

}

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

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

...