2016-08-03 19 views
6

Spring Boot 1.4 bietet einige fantastische Testverbesserungen. Einer ist der @DataJpaTest Annotation, wo es nur die Teile, die für JPA-Tests benötigt werden, verdrahtet. Wie sieht das Äquivalent aus, wenn nur die für die JdbcTemplate Tests benötigten Teile verdrahtet werden?Was entspricht @DataJpaTest, wenn ich nur JdbcTemplate-Code testen möchte?

Ich bin in Ordnung, meine eigene zusammengesetzte Annotation zu konstruieren, die die @DataJpaTest eins nachahmt.

Antwort

14

Gute Frage. Ironischerweise wurde diese während des Testgesprächs gestern auf der SpringOne Platform angesprochen. Lassen Sie uns sehen, was nötig ist, um eine solche dedizierte Testannotation zu implementieren.

TL;DRcheck the code on github

Zunächst einmal müssen Sie die Anmerkung erstellen. Diese Anmerkung verwendet einige Bits aus dem spring-boot-test-autoconfigure-Modul. Möglicherweise möchten Sie eine In-Memory-Datenbank automatisch konfigurieren (z. B. DataJpaTest). Sie möchten auch sicherstellen, dass das Caching standardmäßig konfiguriert und deaktiviert ist (falls Sie in Ihrer Spring Boot-Anwendung @EnableCaching haben). Sie möchten auch, dass alle Ihre Tests standardmäßig @Transactional sind, also sollten Sie das hinzufügen.

Als nächstes wollen Sie, dass das Schneiden in effektiv schlägt. Alles, was Sie an diesem Punkt brauchen, ist ein DataSource, eine JdbcTemplate, Datenbank-Migrationen (flyway/liquibase) und ein Transaktionsmanager @Transactional zu verarbeiten. Um die anderen Auto-Konfigurationen vermeiden Sie treten sollte folgendes hinzufügen:

@OverrideAutoConfiguration(enabled = false) 

Dann möchten Sie ausdrücklich die Auto-Konfigurationen oben ermöglichen. Um dies zu tun, fügen Sie @ImportAutoConfiguration und fügen Sie den folgenden Inhalt in 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 

Der Schlüssel in spring.factories sollte die FQN Ihrer Anmerkung entsprechen. Wenn Spring Boot @ImportAutoConfiguration ohne zusätzliche Attribute findet, wird nach einem Schlüssel gesucht, der dem Annotationstyp in spring.factories entspricht.

Als nächstes möchten Sie zusätzliche Komponenten (Komponentenscan) mit einem Filter hinzufügen können. Um das zu tun, können Sie @TypeExcludeFilters(DataJdbcTypeExcludeFilter.class) hinzufügen, wobei DataJdbcTypeExcludeFilter ist ziemlich genau das gleiche wie DataJpaTypeExcludeFilter (also möchten wir vielleicht eine gemeinsame Klasse dafür extrahieren). automatisch konfiguriert für Sie

@RunWith(SpringRunner.class) 
@DataJdbcTest 
public class DataJdbcSampleTests { 

    @Autowired 
    private JdbcTemplate jdbcTemplate; 

    ... 
} 
+3

Vielen Dank für die ausgezeichnete Antwort

Sobald Sie das getan haben, müssen Sie nur Ihre Anmerkung und Ihre JdbcTemplate ist hinzuzufügen! Außerdem bin ich der Kerl, der die Frage in der Sitzung aufgeworfen hat;) – checketts

+0

Das ist genial! Ich bin froh, dass es hilft. –

+0

Siehe auch [# 6563] (https://github.com/spring-projects/spring-boot/issues/6563) –