#java #spring #elasticsearch #spring-boot
#java #тестирование #весенняя загрузка
Вопрос:
Spring Boot 1.4 предлагает несколько фантастических улучшений в тестировании. Одним из них является @DataJpaTest
аннотация, в которой подключаются только те части, которые необходимы для тестирования JPA. Как будет выглядеть эквивалент простого подключения деталей, необходимых для JdbcTemplate
тестов?
Я в порядке, создавая свою собственную составную аннотацию, которая имитирует @DataJpaTest
ту.
Ответ №1:
Хороший вопрос. По иронии судьбы, этот вопрос был поднят во время вчерашнего выступления по тестированию на платформе SpringOne. Давайте посмотрим, что нужно для реализации такой выделенной тестовой аннотации.
TL;DR
проверьте код на github
Прежде всего, вам нужно создать аннотацию. В этой аннотации повторно используются некоторые биты из spring-boot-test-autoconfigure
модуля. Возможно, вы захотите автоматически настроить базу данных в памяти (например DataJpaTest
, does). Вы также хотите убедиться, что кэширование настроено и отключено по умолчанию (в случае, если у вас есть @EnableCaching
приложение Spring Boot). Вы также хотите, чтобы все ваши тесты были @Transactional
по умолчанию, поэтому вы должны добавить это.
Затем вы хотите, чтобы эта нарезка эффективно сработала. Все, что вам нужно на этом этапе DataSource
JdbcTemplate
, это миграция базы данных (flyway / liquibase) и менеджер транзакций для обработки @Transactional
. Чтобы избежать других автоматических конфигураций, вы должны добавить следующее:
@OverrideAutoConfiguration(enabled = false)
Затем вы хотите явно включить автоматическую настройку выше. Для этого вы добавляете @ImportAutoConfiguration
и добавляете следующее содержимое в META-INF/spring.factories
# AutoConfigureDataJpa auto-configuration imports
com.example.test.autoconfigure.jdbc.DataJdbcTest=
org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,
org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,
org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,
org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration,
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration
Ключ в spring.factories
должен соответствовать FQN вашей аннотации. Всякий раз, когда Spring Boot находит @ImportAutoConfiguration
без дополнительных атрибутов, он будет искать ключ, соответствующий типу аннотации spring.factories
.
Далее вы хотите иметь возможность включать дополнительные компоненты (сканирование компонентов) с фильтром. Чтобы сделать это, вы можете добавить @TypeExcludeFilters(DataJdbcTypeExcludeFilter.class)
, что where DataJdbcTypeExcludeFilter
— это почти то же самое, DataJpaTypeExcludeFilter
что и (поэтому мы можем захотеть извлечь для этого общий класс).
После того, как вы это сделаете, вам нужно только добавить свою аннотацию, и JdbcTemplate
она будет автоматически настроена для вас
@RunWith(SpringRunner.class)
@DataJdbcTest
public class DataJdbcSampleTests {
@Autowired
private JdbcTemplate jdbcTemplate;
...
}
Комментарии:
1. Спасибо за отличный ответ! Кроме того, я тот парень, который поднял вопрос на сессии 😉
2. Это потрясающе! Я рад, что это помогает.
3. решение фантастическое, однако я столкнулся с ошибкой,
TestDatabaseAutoConfiguration
когда он пытается выйти из системыDataSource
,logger.info("Replacing '" holder.getBeanName() "' DataSource bean with embedded version");
но вместо этого получаетNullPointerException
4. NPE при опечатке кажется жестким. Не могли бы вы сообщить, что у вас было, и исключение в нашем трекере? Мы рассмотрим, как улучшить сообщение об ошибке.
Ответ №2:
Я думаю, что вариантом будет @JdbcTest, вы могли бы найти дополнительную информацию в документе.