Partager via


Prise en charge d’Azure Spring Cloud pour Testcontainers

Cet article s’applique à :✅ version 5.19.0

Cet article explique comment intégrer Spring Cloud Azure à Testcontainers pour écrire des tests d’intégration efficaces pour vos applications.

Testcontainers est une infrastructure open source permettant de fournir des instances légères de bases de données, de répartiteurs de messages, de navigateurs web ou tout ce qui peut s’exécuter dans un conteneur Docker. Il s’intègre à JUnit, ce qui vous permet d’écrire une classe de test qui peut démarrer un conteneur avant l’exécution de l’un des tests. Testcontainers est particulièrement utile pour écrire des tests d’intégration qui parlent à un service principal réel.

La bibliothèque spring-cloud-azure-testcontainers prend désormais en charge les tests d’intégration pour les services Azure suivants :

Connexions de service

Une connexion de service est une connexion à n’importe quel service distant. La configuration automatique de Spring Boot peut consommer les détails d’une connexion de service et les utiliser pour établir une connexion à un service distant. Dans ce cas, les détails de la connexion sont prioritaires sur toutes les propriétés de configuration liées à la connexion.

Lorsque vous utilisez Testcontainers, vous pouvez créer automatiquement des détails de connexion pour un service s’exécutant dans un conteneur en annotant le champ conteneur dans la classe de test.

L’annotation @ServiceConnection est traitée par xxxContainerConnectionDetailsFactory classes inscrites auprès de spring.factories. Ces fabriques créent un haricot ConnectionDetails en fonction d’une sous-classe Container spécifique ou du nom de l’image Docker.

Le tableau suivant fournit des informations sur les classes de fabrique des détails de connexion prises en charge dans le fichier JAR spring-cloud-azure-testcontainers :

Classe fabrique des détails de connexion Détails de connexion bean
CosmosContainerConnectionDetailsFactory AzureCosmosConnectionDetails
StorageBlobContainerConnectionDetailsFactory AzureStorageBlobConnectionDetails
StorageQueueContainerConnectionDetailsFactory AzureStorageQueueConnectionDetails

Configurer des dépendances

La configuration suivante configure les dépendances requises :

  • Cosmos
  • Stockage Blob
  • stockage file d’attente
<dependency>
  <groupId>org.testcontainers</groupId>
  <artifactId>azure</artifactId>
</dependency>
<dependency>
  <groupId>com.azure.spring</groupId>
  <artifactId>spring-cloud-azure-testcontainers</artifactId>
</dependency>
<dependency>
  <groupId>com.azure.spring</groupId>
  <artifactId>spring-cloud-azure-starter-cosmos</artifactId>
</dependency>

Utiliser testcontainers

L’exemple de code suivant illustre l’utilisation de base des Testcontainers :

  • Cosmos
  • Stockage Blob
  • stockage file d’attente
@SpringBootTest
@Testcontainers
@ImportAutoConfiguration(classes = { AzureGlobalPropertiesAutoConfiguration.class, AzureCosmosAutoConfiguration.class})
public class CosmosTestcontainersTest {

    @TempDir
    private static File tempFolder;

    @Autowired
    private CosmosClient client;

    @Container
    @ServiceConnection
    static CosmosDBEmulatorContainer cosmos = new CosmosDBEmulatorContainer(
    DockerImageName.parse("mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:latest"));

    @BeforeAll
    static void setup() {
        cosmos.start();
        Path keyStoreFile = new File(tempFolder, "azure-cosmos-emulator.keystore").toPath();
        KeyStore keyStore = cosmos.buildNewKeyStore();
        try {
            keyStore.store(Files.newOutputStream(keyStoreFile.toFile().toPath()), cosmos.getEmulatorKey().toCharArray());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    
        System.setProperty("javax.net.ssl.trustStore", keyStoreFile.toString());
        System.setProperty("javax.net.ssl.trustStorePassword", cosmos.getEmulatorKey());
        System.setProperty("javax.net.ssl.trustStoreType", "PKCS12");
    }

    @Test
    void test() {
        // ...
    }
}

Pour utiliser CosmosDBEmulatorContainer, nous devons préparer un KeyStore pour TLS/SSL. Pour plus d’informations, consultez module Azure Cosmos DB dans la documentation testcontainers. Avec @ServiceConnection, cette configuration permet aux haricots liés à Cosmos DB dans l’application de communiquer avec Cosmos DB s’exécutant à l’intérieur du conteneur Docker géré par Testcontainers. Cette action est effectuée en définissant automatiquement une AzureCosmosConnectionDetails bean, qui est ensuite utilisée par la configuration automatique Cosmos DB, en remplaçant toutes les propriétés de configuration liées à la connexion.

Échantillons

Pour plus d’informations, consultez le dépôt azure-spring-boot-samples sur GitHub.