jeudi 23 février 2023

[Spring ] @DynamicPropertySource & TestContianers


Introduction

Dans le monde du développement logiciel, la gestion des configurations est un défi constant. Les développeurs doivent souvent jongler avec de multiples environnements, chacun ayant ses propres configurations. De plus, ces configurations peuvent changer fréquemment, ce qui peut entraîner des erreurs et des problèmes de performance. Heureusement, Spring Boot a introduit une solution à ce problème avec l’annotation @DynamicPropertySource.

Problème

Dans le passé, les développeurs devaient souvent redéployer leurs applications ou modifier le code source chaque fois qu’une configuration changeait. Cela pouvait être une tâche fastidieuse et sujette aux erreurs. De plus, cela pouvait entraîner des temps d’arrêt inutiles et affecter l’expérience utilisateur.

Solution

L’annotation @DynamicPropertySource introduite dans la dernière version de Spring Boot permet de définir des propriétés dynamiques à partir de sources externes, telles que des fichiers de configuration, des variables d’environnement ou des paramètres système. Cette fonctionnalité est particulièrement utile lorsque vous avez besoin de changer les propriétés de votre application sans avoir à redéployer votre application ou à modifier le code source.

Pour commencer, ajoutons la dépendance “spring-boot-starter-test” à notre application. Cela nous permettra d’utiliser les annotations de test Spring Boot, y compris @DynamicPropertySource.

Maintenant, créons une classe de test et ajoutons la méthode suivante :

@Testcontainers 
public class ExampleTest {

    @Container 
    private static final MySQLContainer mysql = new MySQLContainer(); 

    @DynamicPropertySource 
    static void mysqlProperties(DynamicPropertyRegistry registry) {
        registry.add("spring.datasource.url", mysql::getJdbcUrl); 
        registry.add("spring.datasource.username", mysql::getUsername); 
        registry.add("spring.datasource.password", mysql::getPassword);
    }

    @Test 
    void test() {
        // your test code here
    } 
}

Dans cet exemple, nous utilisons un conteneur MySQL pour notre base de données. Nous utilisons la méthode @DynamicPropertySource pour définir les propriétés de connexion à la base de données. Cette méthode est appelée avant le démarrage de l’application et permet de définir les propriétés de manière dynamique.

Dans le corps de la méthode, nous utilisons la classe DynamicPropertyRegistry pour ajouter les propriétés. Dans cet exemple, nous ajoutons les propriétés “spring.datasource.url”, “spring.datasource.username” et “spring.datasource.password”. Nous utilisons la méthode getJdbcUrl(), getUsername() et getPassword() pour récupérer les valeurs dynamiques de la configuration MySQL.

Maintenant que nous avons défini les propriétés dynamiques, nous pouvons utiliser notre base de données dans notre test. Dans notre cas, nous pouvons utiliser le conteneur MySQL pour créer une table de test et exécuter des requêtes sur cette table.

Voici un exemple de test qui utilise la base de données définie dans notre @DynamicPropertySource :

@Test 
void test() { 
    try (Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC", "root", "password" )) { 
        Statement stmt = conn.createStatement(); 
        stmt.execute("CREATE TABLE example (id INT, name VARCHAR(255))"); 
        stmt.execute("INSERT INTO example (id, name) VALUES (1, 'Test')"); 
        ResultSet rs = stmt.executeQuery("SELECT * FROM example WHERE id=1"); 
        assertTrue(rs.next()); 
        assertEquals("Test", rs.getString("name")); 
    } catch (SQLException e) { 
        fail(e.getMessage()); 
    } 
}

Dans ce test, nous utilisons la connexion JDBC pour se connecter à notre base de données MySQL. Nous créons une table de test, insérons une ligne et récupérons cette ligne en exécutant une requête SELECT. Si tout se passe bien, notre test réussit.

Discussion

En résumé, l’annotation @DynamicPropertySource permet de définir des propriétés de manière dynamique à partir de sources externes.
C’est une fonctionnalité puissante qui peut simplifier la gestion des configurations dans vos applications Spring Boot.

Pour plus d’informations, vous pouvez consulter le guide complet sur [Baeldung].

Aucun commentaire:

Enregistrer un commentaire

to criticize, to improve