Автонастройка Spring Boot, источник данных Hikari не работает при извлечении свойств из файла yaml в JUnit

Это очень похоже на случай [33213854]: Однако у меня есть..

@SpringBootApplication
@EntityScan(basePackages= "com.bla.bla")
@Import({RepositoryRestMvcConfiguration.class, PersistenceContext.class})
public class Main {..}

@Configuration
// Using.. application.yml -------
@ConfigurationProperties(prefix = "spring.datasource") 
@EnableJpaRepositories(basePackages = {"com.aa.bb.repository"})
@EnableTransactionManagement 
public class PersistenceContext extends HikariConfig {

@Bean(destroyMethod = "close")
public DataSource dataSource() throws SQLException {
    return new HikariDataSource(this);
} ..
} ..

Источник данных Hikari не заполняется свойствами во время тестирования. Тест это..

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = {PersistenceContext.class}, 
initializers = {ConfigFileApplicationContextInitializer.class})
public class MyIntegrationTests {

@Autowired
MyRepository repository;

@Test
public void findsSomethingIn() {
    Page<ResourceBundle> bundles= this.repository.findAll(new PageRequest(0, 10));
    assertThat(bundles.getTotalElements(), is(greaterThan(20L)));
}
}

Application.yml

spring:
  datasource:
    driverClassName: org.postgresql.Driver
    jdbcUrl: jdbc:postgresql://localhost:5432/any
    username: uid
    password: xxx

Однако во время теста я получаю ..

IllegalArgumentException: требуется dataSource или dataSourceClassName или jdbcUrl. на com.zaxxer.hikari.HikariConfig.validate(HikariConfig.java:784)

Я был бы очень признателен за любой совет.


person Jrr    schedule 19.06.2016    source источник
comment
spring.datasource — это пространство имен, которое мы уже связываем с чем-то совершенно другим, поэтому я бы не стал его использовать. Используйте собственное пространство имен. Меня смущает то, что вы пытаетесь сделать: если вы используете стандартное свойство Spring Boot, мы уже автоматически настраиваем hikari для вас. Почему вы определяете вещи, которые выполняются автоматически при загрузке?   -  person Stephane Nicoll    schedule 20.06.2016
comment
Стефан, я так же предполагал, что все это будет делаться ботинком, это не так, и я хочу знать, почему. Main.class — это моя загрузка, PersistenceContext.class — это моя конфигурация, которая должна определять другой тип AtBeans вместо источника данных Hikari, но, учитывая, что Hikari не работает со свойствами, я пытаюсь ввести их вручную… и это моя забота. , почему это не работает на моем UnitTest?. Поэтому я буду использовать другое пространство имен, однако в документации сказано:   -  person Jrr    schedule 20.06.2016
comment
[ссылка] (docs.spring.io/spring-boot/docs/current/reference/htmlsingle/) Раздел: 29.1.2 Подключение к рабочей базе данных   -  person Jrr    schedule 20.06.2016
comment
можете поделиться образцом? Я не вижу причины, по которой это не сработает в таком модульном тесте.   -  person Stephane Nicoll    schedule 20.06.2016
comment
Я просто хочу запустить свой unitTest.class, используя как boot-autoconfiguration, так и мой класс пользовательской конфигурации, который будет иметь BEAN, кроме декларации Hikari-datasource, и выполнить unitTest.class, используя их. Это возможно? (как упоминалось выше, мой unitTest.class сейчас не работает, потому что spring-boot не вводит значения свойств через автоконфигурацию). Также я безуспешно пытался использовать myparams.datasource вместо spring.datasource в качестве префикса.   -  person Jrr    schedule 20.06.2016
comment
Стефан, это концентрированная информация, с которой я столкнулся при поиске проблемы в Google. (help-doing.com/sof/26490967.shtml), похоже, никто пытались использовать Hikari через загрузочную автоконфигурацию.. не так ли?   -  person Jrr    schedule 21.06.2016


Ответы (2)


РЕШЕНО!!: Используйте @SpringApplicationConfiguration для Unit-TESTing вместо @ContextConfiguration, так как тестовые классы неправильно подбирали конфигурации приложения... но ПОЧЕМУ?. Справочный пример: 22138366

person Jrr    schedule 21.06.2016

Для Spring 1.4 у меня была очень похожая проблема, которую я решил, добавив: @EnableAutoConfiguration в класс конфигурации (в моем случае это DataSourceConfig.class)

И в тесте пометьте тестовый класс следующим образом:

@RunWith(SpringRunner.class)
@Transactional()
@SpringBootTest(classes = DataSourceConfig.class)
@ActiveProfiles("dao-test")

-------- В качестве примера --------

(1) Мой DataSourceConfig.class выглядит так:

@Configuration
@ComponentScan
@EnableTransactionManagement
@EnableAutoConfiguration
public class DataSourceConfig {

    @Bean
    public JdbcTemplate jdbcTemplate(DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }

    @Bean
    public PlatformTransactionManager transactionManager(DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
}

(2) И тестовый класс выглядит так:

@RunWith(SpringRunner.class)
@Transactional()
@SpringBootTest(classes = DataSourceConfig.class)
@ActiveProfiles("dao-test")
public abstract class DaoTest {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Test
    ...
}

(3) С файлом pom выглядит так:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-jdbc</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

как упомянул Уилкинсона: «Если вы хотите использовать HikariCP, просто убедитесь, что пул соединений Tomcat не находится в пути к классам, а HikariCP находится в пути к классам. Если вы используете spring-boot-starter-jdbc, вам нужно исключить tomcat-jdbc, в противном случае достаточно просто добавить зависимость Hikari».

см. ссылку ниже.

(4) И resources/application-dao-test.properties выглядят так:

# PostgreSQL Data Source
spring.datasource.url=jdbc:postgresql://${IT_DOCKER_HOST_IP}:${IT_PG_PORT}/db-name
spring.datasource.username=xxx
spring.datasource.password=xxx
# the config below seems not needed:
spring.datasource.type=com.zaxxer.hikari.HikariDataSource

Ссылка:

https://github.com/spring-projects/spring-boot/issues/1426 https://www.javacodegeeks.com/2016/03/springboot-working-jdbctemplate.html

person Fuyang Liu    schedule 27.09.2016