2016-08-03 9 views
6

Spring Boot 1.4 oferuje kilka fantastycznych ulepszeń testowania. Jednym z nich jest adnotacja @DataJpaTest, w której łączy się tylko części potrzebne do testowania JPA. Jak wyglądałby ten ekwiwalent w przypadku podłączania części potrzebnych do testów JdbcTemplate?Jaki jest odpowiednik @DataJpaTest, jeśli chcę przetestować kod JdbcTemplate?

W porządku, tworzę własną adnotację złożoną, która naśladuje ten jeden @DataJpaTest.

Odpowiedz

14

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;DRcheck 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; 

    ... 
} 
+3

Dzięki za doskonałą odpowiedź! Poza tym jestem facetem, który zadał pytanie podczas sesji;) – checketts

+0

To świetnie! Cieszę się, że to pomaga. –

+0

Zobacz także [# 6563] (https://github.com/spring-projects/spring-boot/issues/6563) –