Что эквивалентно @DataJpaTest, если я просто хочу протестировать код JdbcTemplate?

#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, вы могли бы найти дополнительную информацию в документе.