Comment recréer la base de données avant chaque test au printemps?

mon application Spring-Boot-Mvc-Web a la configuration de base de données suivante dans le fichier application.properties :

spring.datasource.url=jdbc:h2:tcp://localhost/~/pdk
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.driver-class-name=org.h2.Driver

c'est la seule config que j'ai faite. Aucune autre configuration faite par moi nulle part. Néanmoins le ressort et les sous-systèmes recréent automatiquement la base de données sur chaque exécution d'application web. Base de données est recréé à savoir sur le fonctionnement du système alors qu'il contient des données après la fin de l'application.

Je ne comprenais pas ce défaut et m'attendais à cela est approprié pour les tests.

mais quand j'ai commencé à faire des tests, j'ai découvert que la base de données n'est recréée qu'une seule fois. Puisque les tests ne sont pas exécutés dans un ordre prédéfini, cela n'a aucun sens.

ainsi, la question Est: comment faire un sens? C'est-à-dire: comment faire recréer la base de données avant chaque test comme il arrive au premier démarrage de l'application?

mon en-tête de classe d'essai est le suivant:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = myapp.class)
//@WebAppConfiguration
@WebIntegrationTest
@DirtiesContext
public class WebControllersTest {

comme vous le voyez, j'ai essayé @DirtiesContext au niveau de la classe et ça n'a pas aidé.

mise à JOUR

j'ai un haricot

@Service
public class DatabaseService implements InitializingBean {

qui a une méthode

@Override
    @Transactional()
    public void afterPropertiesSet() throws Exception {
        log.info("Bootstrapping data...");
        User user = createRootUser();
        if(populateDemo) {
            populateDemos();
        }
        log.info("...Bootstrapping completed");
    }

maintenant j'ai fait populateDemos() méthode pour effacer toutes les données de la base de données. Malheureusement, il n'est pas appelé avant chaque test malgré @DirtiesContext . Pourquoi?

21
demandé sur Dims 2016-01-05 19:59:16

5 réponses

en fait, je pense que vous voulez ceci:

@DirtiesContext(classMode = ClassMode.BEFORE_EACH_TEST_METHOD)

http://docs.spring.io/autorepo/docs/spring-framework/4.2.6.RELEASE/javadoc-api/org/springframework/test/annotation/DirtiesContext.html

@DirtiesContext peut être utilisé au niveau de la classe et de la méthode annotation dans la même classe. Dans de tels scénarios, l' ApplicationContext sera marqué comme sale après tout ces annoté la méthode ainsi que d'après l'ensemble de la classe. Si l' DirtiesContext.ClassMode est défini à AFTER_EACH_TEST_METHOD, le contexte sera marqué sale après chaque méthode d'essai dans la classe.

45
répondu Raphael Amoedo 2016-05-16 03:39:07

pour créer la base de données, vous devez faire ce que les autres réponses disent avec le spring.jpa.hibernate.ddl-auto=create-drop , maintenant si votre intention est de pupuler la base de données sur chaque test, puis le printemps fournit une très utile anotation

@Transactional(value=JpaConfiguration.TRANSACTION_MANAGER_NAME)
@Sql(executionPhase=ExecutionPhase.BEFORE_TEST_METHOD,scripts="classpath:/test-sql/group2.sql")
public class GroupServiceTest extends TimeoffApplicationTests {

qui est de ce paquet org.springframework.test.context.jdbc.Sql; et vous pouvez exécuter une méthode d'essai avant et une méthode d'essai après. Pour remplir la base de données.

concernant la création de la base de données à chaque fois, dites que vous voulez seulement votre Test pour avoir le vous pouvez configurer vos tests avec des propriétés personnalisées avec cette annotation

@TestPropertySource(locations="classpath:application-test.properties")
public class TimeoffApplicationTests extends AbstractTransactionalJUnit4SpringContextTests{

j'Espère que ça aide

6
répondu jstuartmilne 2016-01-05 22:11:30

si vous utilisez spring.jpa.hibernate.ddl-auto=create-drop devrait être suffisant pour créer/supprimer la base de données?

4
répondu user2669657 2016-01-05 18:00:04

avec amorçage à ressort, la base de données h2 peut être définie uniquement pour chaque test. Il suffit de surcharger L'URL de la source de données pour chaque test

 @SpringBootTest(properties = {"spring.config.name=myapp-test-h2","myapp.trx.datasource.url=jdbc:h2:mem:trxServiceStatus"})

les essais peuvent être effectués en parallèle.

dans le test, les données peuvent être réinitialisées par

@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
3
répondu Interlated 2018-04-04 07:10:15

à moins que vous n'utilisiez une sorte D'intégration de données de printemps (que je ne connais pas du tout), cela ressemble à une logique personnalisée dont vous aurez besoin pour mettre en œuvre vous-même. Spring ne connaît pas vos bases de données, ses schémas et vos tables.

en supposant JUnit, écrivez les méthodes appropriées @Before et @After pour mettre en place et nettoyer votre base de données, ses tables, et les données. Vos tests peuvent eux-mêmes écrire les données dont ils ont besoin, et potentiellement nettoyer après eux-mêmes si approprié.

2
répondu Sotirios Delimanolis 2016-01-05 17:23:45