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;
}
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)
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.
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());
}
}
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);
}
}
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
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)
vous pouvez également poursuivre l'annotation suivante:
@RunWith(SpringRunner.class)
@DataJpaTest(excludeAutoConfiguration = {MySqlConfiguration.class, ...})
public class TheClassYouAreUnitTesting {
}