Dobre pytanie. Jak na ironię, ta została podniesiona podczas wczorajszej rozmowy testowej na platformie SpringOne. Zobaczmy, co trzeba zrobić, aby zaimplementować taką dedykowaną adnotację testową.
TL;DR
check the code on github
Przede wszystkim trzeba stworzyć adnotacji. Ta adnotacja wykorzystuje niektóre bity z modułu spring-boot-test-autoconfigure
. Możesz automatycznie skonfigurować bazę danych w pamięci (np. DataJpaTest
). Należy również upewnić się, że buforowanie jest domyślnie skonfigurowane i wyłączone (w przypadku, gdy masz @EnableCaching
w aplikacji Spring Boot). Również chcesz, aby wszystkie twoje testy były domyślnie @Transactional
, więc powinieneś to dodać.
Następnie chcesz że krojenie skutecznie w rzutach. Wszystko czego potrzebujesz w tym momencie jest DataSource
, A JdbcTemplate
, migracje baz danych (flyway/liquibase) i menedżer transakcji przetwarzać @Transactional
. Aby uniknąć innych auto-konfiguracji kopać w was należy dodać następujące:
@OverrideAutoConfiguration(enabled = false)
Następnie chcesz jawnie włączyć powyżej auto-konfiguracji. Aby to zrobić, trzeba dodać @ImportAutoConfiguration
i dodaj następującą zawartość 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
Klucz w spring.factories
powinna odpowiadać FQN swojej adnotacji. Gdy tylko Spring Boot znajdzie @ImportAutoConfiguration
bez dodatkowych atrybutów, wyszuka klucz pasujący do typu adnotacji w spring.factories
.
Następnie chcesz mieć możliwość dołączenia dodatkowych komponentów (skanowanie komponentów) za pomocą filtra. Aby to zrobić, możesz dodać @TypeExcludeFilters(DataJdbcTypeExcludeFilter.class)
, gdzie DataJdbcTypeExcludeFilter
to prawie to samo, co DataJpaTypeExcludeFilter
(abyśmy mogli wydobyć z tego wspólną klasę).
Gdy już to zrobisz, trzeba tylko dodać adnotację a JdbcTemplate
jest automatycznie skonfigurowana
@RunWith(SpringRunner.class)
@DataJdbcTest
public class DataJdbcSampleTests {
@Autowired
private JdbcTemplate jdbcTemplate;
...
}
Dzięki za doskonałą odpowiedź! Poza tym jestem facetem, który zadał pytanie podczas sesji;) – checketts
To świetnie! Cieszę się, że to pomaga. –
Zobacz także [# 6563] (https://github.com/spring-projects/spring-boot/issues/6563) –