Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Spring Java Discussion :

Spring et H2 pour tests


Sujet :

Spring Java

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2018
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : janvier 2018
    Messages : 1
    Points : 3
    Points
    3
    Par défaut Spring et H2 pour tests
    Bonjour tout le monde,

    J'ai une application fonctionnant avec Spring Boot, j'utilise donc les JPA pour gérer la base de données et une base H2 pour faire mes tests (première fois que je travaille avec). J'ai une requête en native dans mon repository qui récupère le dernier ID généré :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    @Query(value = "SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA = \"myapp\" AND TABLE_NAME = \"mytable\"", nativeQuery = true)
    public Long getNextId();
    En production, sur une base MariaDB, la requête fonctionne très bien, et le web service qui y fait appel (via le repository) aussi. Mais en passant par mon test d'intégration avec la base H2, la colonne AUTO_INCREMENT pose problème. Voici l'erreur qui ressort :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Column "AUTO_INCREMENT" not found; SQL statement:
    SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA = "myapp" AND TABLE_NAME = "mytable" [42122-200]
    2020-02-11 11:44:51.341 DEBUG 14296 --- [           main] .w.s.m.a.ResponseStatusExceptionResolver : Resolved [com.extia.mm.excpetion.BadRequestException: could not prepare statement; SQL [SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA = "myapp" AND TABLE_NAME = "mytable"]; nested exception is org.hibernate.exception.SQLGrammarException: could not prepare statement]
    Voici le code du test et mes propriétés pour l'environnement de test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    @Autowired
    private MockMvc mvc;
     
    @Autowired
    ObjectMapper objectMapper;
     
    @Rule
    public TemporaryFolder folder = new TemporaryFolder();
     
    @Test
    public void createCarteIntegration() throws Exception {
    	// Initialisation des données
     
    	File file = new File("src/test/resources/com/extia/mm/images/supfiles.png");
     
    	InputStream is = new FileInputStream(file);
     
    	MockMultipartFile mmf = new MockMultipartFile("file", is);
     
    	mvc.perform(multipart("/save/carte").file(mmf).queryParam("nom", "SupFiles").queryParam("description",
    			"une description quelconque avec des é è @ \' \" & $")).andDo(print()).andExpect(status().isCreated());
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    spring.datasource.url=jdbc:h2:mem:testdb;MODE=MYSQL;INIT=CREATE SCHEMA IF NOT EXISTS testdb;
    spring.datasource.driverClassName=org.h2.Driver
    spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect
    spring.jpa.properties.hibernate.default_schema=testdb
    spring.h2.console.enabled=true
    spring.h2.console.path=/h2
    spring.jpa.hibernate.ddl-auto =update
    spring.jpa.database-platform =org.hibernate.dialect.MySQL8Dialect
    logging.level.org.springframework.web=DEBUG
    J'ai essayé pas mal de configurations possibles, j'ai cherché des problèmes similaires mais je n'en ai pas trouvé. Je sèche...

    J'espère que j'ai été assez précis.
    Merci d'avance pour votre aide !

  2. #2
    Membre extrêmement actif Avatar de ddoumeche
    Homme Profil pro
    Ingénieur recherche et développement
    Inscrit en
    octobre 2007
    Messages
    1 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Singapour

    Informations professionnelles :
    Activité : Ingénieur recherche et développement

    Informations forums :
    Inscription : octobre 2007
    Messages : 1 264
    Points : 2 255
    Points
    2 255
    Par défaut
    Ta NativeQuery n'est effectivement pas portable, mais on peut questionner la pertinence de prendre deux bases de données différentes en test, en staging et en production.

    Qu'est-ce qui t'empêche de récupérer le champs annoté par @GeneratedValue de ton entité une fois sauvegardée ? Ou plus salement de déléguer la tache aux driver jdbc via un Statement#getGeneratedKeys
    La joie de l'âme est dans la planification -- Louis Hubert Liautey

Discussions similaires

  1. [D2005] Compact Framework irrecuperable pour test
    Par Bosno dans le forum Delphi .NET
    Réponses: 7
    Dernier message: 27/09/2005, 17h00
  2. petit prg pour test
    Par grand's dans le forum DirectX
    Réponses: 2
    Dernier message: 07/09/2005, 15h49
  3. Hackers pour tests d'un système de cryptographie
    Par duchere dans le forum Algorithmes et structures de données
    Réponses: 32
    Dernier message: 27/07/2005, 14h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo