Freigeben über


Spring Cloud Azure-Unterstützung für Testcontainer

Dieser Artikel gilt für:✅ Version 5.19.0

In diesem Artikel wird beschrieben, wie Sie Spring Cloud Azure in Testcontainer integrieren, um effektive Integrationstests für Ihre Anwendungen zu schreiben.

Testcontainers ist ein Open-Source-Framework zum Bereitstellen von Ausschütten, einfachen Instanzen von Datenbanken, Nachrichtenbrokern, Webbrowsern oder alles, was in einem Docker-Container ausgeführt werden kann. Es ist in JUnit integriert, sodass Sie eine Testklasse schreiben können, die einen Container starten kann, bevor eine der Tests ausgeführt wird. Testcontainers ist besonders nützlich für das Schreiben von Integrationstests, die mit einem echten Back-End-Dienst sprechen.

Die spring-cloud-azure-testcontainers-Bibliothek unterstützt jetzt Integrationstests für die folgenden Azure-Dienste:

Dienstverbindungen

Eine Dienstverbindung ist eine Verbindung mit einem beliebigen Remotedienst. Die Autokonfiguration von Spring Boot kann die Details einer Dienstverbindung nutzen und diese verwenden, um eine Verbindung mit einem Remotedienst herzustellen. Dabei haben die Verbindungsdetails Vorrang vor verbindungsbezogenen Konfigurationseigenschaften.

Wenn Sie Testcontainer verwenden, können Sie automatisch Verbindungsdetails für einen Dienst erstellen, der in einem Container ausgeführt wird, indem Sie das Containerfeld in der Testklasse kommentieren.

Die @ServiceConnection Anmerkung wird von xxxContainerConnectionDetailsFactory Klassen verarbeitet, die mit spring.factoriesregistriert sind. Diese Fabriken erstellen eine ConnectionDetails Bean basierend auf einer bestimmten Container Unterklasse oder dem Docker-Imagenamen.

Die folgende Tabelle enthält Informationen zu den in der spring-cloud-azure-testcontainers JAR unterstützten Verbindungsdetails-Factoryklassen:

Verbindungsdetails Factoryklasse Verbindungsdetailsanker
CosmosContainerConnectionDetailsFactory AzureCosmosConnectionDetails
StorageBlobContainerConnectionDetailsFactory AzureStorageBlobConnectionDetails
StorageQueueContainerConnectionDetailsFactory AzureStorageQueueConnectionDetails

Einrichten von Abhängigkeiten

Die folgende Konfiguration richtet die erforderlichen Abhängigkeiten ein:

<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>

Verwenden von Testcontainern

Im folgenden Codebeispiel wird die grundlegende Verwendung von Testcontainern veranschaulicht:

@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() {
        // ...
    }
}

Um CosmosDBEmulatorContainerzu verwenden, müssen wir eine KeyStore für TLS/SSL vorbereiten. Weitere Informationen finden Sie unter Cosmos DB Azure Module in der Testcontainers-Dokumentation. Mit @ServiceConnectionermöglicht diese Konfiguration Cosmos DB-bezogenen Bohnen in der App, mit Cosmos DB zu kommunizieren, die im Testcontainers-verwalteten Docker-Container ausgeführt wird. Diese Aktion erfolgt durch die automatische Definition einer AzureCosmosConnectionDetails Bean, die dann von der Autokonfiguration von Cosmos DB verwendet wird und alle verbindungsbezogenen Konfigurationseigenschaften außer Kraft gesetzt wird.

Proben

Weitere Informationen finden Sie in den Azure-spring-boot-samples Repository auf GitHub.