web-dev-qa-db-fra.com

Comment exclure/désactiver une configuration automatique spécifique dans Spring boot 1.4.0 pour @DataJpaTest?

J'utilise le @DataJpaTest de Spring pour mon test, qui utilisera ensuite H2 comme dans la base de données en mémoire, comme décrit dans ici . J'utilise aussi Flyway pour la production. Cependant, une fois le test lancé, FLyway démarre et lit le fichier SQL. Comment puis-je exclure la configuration FlywayAuto et conserver le reste comme décrit ici dans la documentation de printemps afin de permettre à Hibernate de créer les tables dans H2 pour moi? 

@RunWith(SpringRunner.class)
@DataJpaTest
public class MyRepositoryTest {

    @Autowired
    private TestEntityManager entityManager;

    @Autowired
    private MyRepository triggerRepository;
}
12
LAC

Avez-vous essayé l'annotation @OverrideAutoConfiguration ? ?__. Il dit que "peut être utilisé pour remplacer @EnableAutoConfiguration" .. Je suppose qu'à partir de là, vous pouvez exclure FlywayAutoConfiguration

@EnableAutoConfiguration(exclude=FlywayAutoConfiguration.class)
5
Livia Moroianu

Ajout de la dépendance à une base de données en mémoire à mon build.gradle
par exemple. testRuntime "com.h2database:h2:1.4.194"

Et ajouter flyway.enabled=false au fichier application.properties dans src/test/resources a fonctionné pour moi.

4
Trevor Gowing

Je convertis une ancienne application JDBC en une application spring-data-jpa et je travaille actuellement sur les premiers tests. J'ai continué à voir une erreur d'instanciation de module de sécurité de la part de spring-boot alors qu'il essayait d'initialiser la configuration de la sécurité, même si @DataJpaTest devrait théoriquement l'exclure.

Mon problème avec le module de sécurité provient probablement de l'implémentation préexistante dont j'ai hérité en utilisant PropertySourcesPlaceholderConfigurer (via mon importation PropertySpringConfig ci-dessous)

En suivant les docs ici:

http://docs.spring.io/spring-boot/docs/1.4.x/reference/htmlsingle/#test-auto-configuration

et vos commentaires sur la réponse de @ LiviaMorunianu, j’ai réussi à contourner toutes les exceptions printanières et à exécuter JUnit avec une base de données intégrée auto-configurée. 

Ma classe principale/de production spring-boot bootstrap amorce tout, y compris les éléments que je veux exclure de mes tests. Ainsi, au lieu d’utiliser @DataJpaTest, j’ai copié une grande partie de ce qu’il fait, en utilisant @Import pour importer les configurations centralisées que chaque configuration de test/live utilisera.

J'ai également eu des problèmes en raison de la structure du paquet que j'utilise, car au départ, j'exécutais le test qui était basé sur com.mycompany.repositories et les entités contenues dans com.mycompany.entities n'ont pas été trouvées.

Vous trouverez ci-dessous les classes pertinentes.

JUnit Test

@RunWith(SpringRunner.class)
@Transactional
@Import({TestConfiguration.class, LiveConfiguration.class})
public class ForecastRepositoryTests {    

    @Autowired
    ForecastRepository repository;
    Forecast forecast; 

    @Before
    public void setUp() {
        forecast = createDummyForecast(TEST_NAME, 12345L);
    }

    @Test
    public void testFindSavedForecastById() {
        forecast = repository.save(forecast);
        assertThat(repository.findOne(forecast.getId()), is(forecast));
    }

Configuration en direct

@Configuration
@EnableJpaRepositories(basePackages = {"com.mycompany.repository"})
@EntityScan(basePackages = {"com.mycompany.entity"})
@Import({PropertySpringConfig.class})
public class LiveConfiguration {}

Configuration de test

@OverrideAutoConfiguration(enabled = false)
@ImportAutoConfiguration(value = {
        CacheAutoConfiguration.class,
        JpaRepositoriesAutoConfiguration.class,
        DataSourceAutoConfiguration.class,
        DataSourceTransactionManagerAutoConfiguration.class,
        HibernateJpaAutoConfiguration.class,
        TransactionAutoConfiguration.class,
        TestDatabaseAutoConfiguration.class,
        TestEntityManagerAutoConfiguration.class })
public class TestConfiguration {
    // lots of bean definitions...
}

PropertySpringConfig

@Configuration
public class PropertySpringConfig {
    @Bean
    static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() 
                throws IOException {
        return new CorePropertySourcesPlaceholderConfigurer(
            System.getProperties());
    }
}
2
Adam

J'ai résolu le même problème en excluant l'autoconfiguration de la définition de mon application, c'est-à-dire.

@SpringBootApplication(exclude = {FlywayAutoConfiguration.class})
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
1
Kristoffer

Dans mon cas particulier, je devais désactiver FlywayDB lors des tests d'intégration en mémoire. Ceux-ci utilisent un ensemble d'annotations de ressort pour la configuration automatique d'un contexte d'application limité.

@ImportAutoConfiguration (valeur = TestConfig.class, exclude = FlywayAutoConfiguration.class )

l'exclusion pourrait effectivement limiter davantage l'ensemble de haricots initiés pour ce test

1
padisah

J'ai eu le même problème avec mes tests DbUnit définis dans les classes de tests Spock. Dans mon cas, j'ai pu désactiver la migration de Flyway et j'ai réussi à initialiser les tables de base de données de test H2 comme ceci:

@SpringBootTest(classes = MyApplication.class, webEnvironment = SpringBootTest.WebEnvironment.NONE,
    properties = ["flyway.enabled=false", "spring.datasource.schema=db/migration/h2/V1__init.sql"])

J'ai ajouté cette annotation à ma classe de spécification de test Spock. De plus, je ne pouvais le faire fonctionner que si j'y ajoutais aussi l'annotation de configuration de contexte:

@ContextConfiguration(classes = MyApplication.class)
1
virgium03

vous pouvez également poursuivre l'annotation suivante:

@RunWith(SpringRunner.class)
@DataJpaTest(excludeAutoConfiguration = {MySqlConfiguration.class, ...})
public class TheClassYouAreUnitTesting {
}
0
Seyed Ketabchi