Весенний тест загрузки неправильной конфигурации классов - PullRequest
0 голосов
/ 25 июня 2018

Я пытаюсь протестировать свой слой репозитория с помощью Spring Boot 2.0.1, но когда я запускаю свой тестовый класс, Spring пытается создать экземпляр класса Config не из тестового пакета.

Вот тестовый код:

TestConfig.class

@Configuration
@Import(value = {TestDatabaseConfig.class})
@Profile("local")
public class TestConfig {

}

TestDatabaseConfig.class

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef = "logEntityManagerFactory",
        transactionManagerRef = "logTransactionManager",
        basePackages = { "it.xxx.yyy.repository.log" })
@EntityScan(basePackages = {"it.xxx.yyy.model.log", "it.xxx.yyy.common"})
@Profile("local")
public class TestDatabaseConfig {

@Bean("logDataSourceProperties")
public DataSourceProperties logDataSourceProperties() {
    return new DataSourceProperties();
}


@Bean(name = "logDataSource")
public DataSource dataSource(@Qualifier("logDataSourceProperties") DataSourceProperties properties) {
    return new EmbeddedDatabaseBuilder()
            .setType(EmbeddedDatabaseType.H2)
            .addScript("classpath:schema.sql")
            .build();
}

@Bean(name = "logEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean logEntityManagerFactory(EntityManagerFactoryBuilder builder,
                                                                      @Qualifier("logDataSource") DataSource logDataSource) {
    return builder.dataSource(logDataSource)
            .packages("it.xxx.model.log")
            .persistenceUnit("log")
            .build();
}

@Bean(name = "logTransactionManager")
public PlatformTransactionManager logTransactionManager(@Qualifier("logEntityManagerFactory")EntityManagerFactory logEntityManagerFactory) {
    return new JpaTransactionManager(logEntityManagerFactory);
}

}

Когда я запускаю этот класс

@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles("local")
public class LogRepositoryTest {

    @Autowired
    private ResultLogRepository resultLogRepository;

    @Test
    public void init(){
    }
}

он говорит:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'kafkaProducer': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'kafka.topic.operation' in value "${kafka.topic.operation}"
[...]
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'kafka.topic.operation' in value "${kafka.topic.operation}"

Но я не могу понять, почему он вызывает мой класс KafkaProducer.class из моего основного пакета (на котором есть аннотация @Configuration).

1 Ответ

0 голосов
/ 25 июня 2018

В вашем LogRepositoryTest тестовом классе вы должны указать альтернативный класс конфигурации теста, который следует принять во внимание, в вашем случае, я думаю, это должна быть TestConfig.

Из Spring Boot документация:

Если вы знакомы с Spring Test Framework, вы можете использовать @ContextConfiguration(classes=…​), чтобы указать, какой Spring @Configuration загрузить.В качестве альтернативы вы могли часто использовать вложенные классы @Configuration в своем тесте.

Так что аннотируйте LogRepositoryTest с помощью @ContextConfiguration(classes = {TestConfig.class})

@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles("local")
@ContextConfiguration(classes = {TestConfig.class})
public class LogRepositoryTest {

    @Autowired
    private ResultLogRepository resultLogRepository;

    @Test
    public void init(){
    }
}

ОБНОВЛЕНИЕ

Также аннотируйте свой класс конфигурации с помощью:

@EnableAutoConfiguration

Что-то вроде:

@Configuration
@EnableAutoConfiguration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef = "logEntityManagerFactory",
        transactionManagerRef = "logTransactionManager",
        basePackages = { "it.xxx.yyy.repository.log" })
@EntityScan(basePackages = {"it.xxx.yyy.model.log", "it.xxx.yyy.common"})
@Profile("local")
public class TestDatabaseConfig {
//...
}

ОБНОВЛЕНИЕ 2

Для ошибки:

Вызвано: org.springframework.beans.factory.NoUniqueBeanDefinitionException: нет подходящего компонента типа 'org.springframework.boot.autoconfigure.jdbc.DataSourceProperties': не найдено ожидаемого единственного соответствующего компонента, но 2 найдено: logDataSourceProperties, spring.datasource-org.springframework.boot.autoconfigure.jdbc.DataSourceProperties

Полностью удалите метод:

@Bean("logDataSourceProperties")
public DataSourceProperties logDataSourceProperties() {
    return new DataSourceProperties();
}

и измените свой:

@Bean(name = "logDataSource")
public DataSource dataSource(@Qualifier("logDataSourceProperties") DataSourceProperties properties) {
 // ...
}

до:

@Bean(name = "logDataSource")
public DataSource dataSource(DataSourceProperties properties) {
 // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...