Spring Cloud Azure-Unterstützung für Testcontainer

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

Testcontainer ist ein Open-Source-Framework zur Bereitstellung von kurzlebigen, leichtgewichtigen Instanzen von Datenbanken, Message-Brokern, Webbrowsern oder praktisch allem, das 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. Testcontainer 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.

xxxContainerConnectionDetailsFactory Klassen werden bei spring.factories registriert. 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 Verbindungsdetails-Bean
CosmosContainerConnectionDetailsFactory AzureCosmosConnectionDetails
StorageBlobContainerConnectionDetailsFactory AzureStorageBlobConnectionDetails
StorageQueueContainerConnectionDetailsFactory AzureStorageQueueConnectionDetails
EventHubsContainerConnectionDetailsFactory AzureEventHubsConnectionDetails
ServiceBusContainerConnectionDetailsFactory AzureServiceBusConnectionDetails

Richten Sie Abhängigkeiten ein

Die folgende Konfiguration richtet die erforderlichen Abhängigkeiten ein:

  <properties>
    <version.spring.cloud.azure>7.4.0</version.spring.cloud.azure>
  </properties>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>com.azure.spring</groupId>
        <artifactId>spring-cloud-azure-dependencies</artifactId>
        <version>${version.spring.cloud.azure}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.testcontainers</groupId>
      <artifactId>testcontainers-junit-jupiter</artifactId>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>com.azure.spring</groupId>
      <artifactId>spring-cloud-azure-testcontainers</artifactId>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>com.azure.spring</groupId>
      <artifactId>spring-cloud-azure-starter-cosmos</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>

Verwenden von Testcontainern

Im folgenden Codebeispiel wird die grundlegende Verwendung von Testcontainern veranschaulicht:

@SpringBootTest(classes = CosmosTestcontainersTest.class)
@Testcontainers
@ExtendWith(SpringExtension.class)
@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"))
                .waitingFor(Wait.forHttps("/_explorer/emulator.pem").forStatusCode(200).allowInsecure())
                .withStartupTimeout(Duration.ofMinutes(3));

    @BeforeAll
    public static void setup() throws IOException, CertificateException, KeyStoreException, NoSuchAlgorithmException {
        Path keyStoreFile = new File(tempFolder, "azure-cosmos-emulator.keystore").toPath();
        KeyStore keyStore = cosmos.buildNewKeyStore();
        try (var out = Files.newOutputStream(keyStoreFile.toFile().toPath())) {
            keyStore.store(out, cosmos.getEmulatorKey().toCharArray());
        }

        System.setProperty("javax.net.ssl.trustStore", keyStoreFile.toString());
        System.setProperty("javax.net.ssl.trustStorePassword", cosmos.getEmulatorKey());
        System.setProperty("javax.net.ssl.trustStoreType", "PKCS12");
    }

    @Test
    public void test() {
        CosmosDatabaseResponse databaseResponse = client.createDatabaseIfNotExists("Azure");
        assertThat(databaseResponse.getStatusCode()).isEqualTo(201);
        CosmosContainerResponse containerResponse = client
            .getDatabase("Azure")
            .createContainerIfNotExists("ServiceContainer", "/name");
        assertThat(containerResponse.getStatusCode()).isEqualTo(201);
    }

}

Um CosmosDBEmulatorContainer zu verwenden, müssen Sie ein KeyStore für TLS/SSL vorbereiten. Weitere Informationen finden Sie unter Cosmos DB Azure Module in der Testcontainers-Dokumentation. Mit @ServiceConnection ermöglicht diese Konfiguration, dass die Cosmos DB-bezogenen Beans in der App mit der Cosmos DB kommunizieren können, die in dem von Testcontainers verwalteten Docker-Container ausgeführt wird. Diese Konfiguration definiert automatisch ein AzureCosmosConnectionDetails Bean, das von der Cosmos-DB-Autokonfiguration verwendet wird, um alle verbindungsbezogenen Konfigurationseigenschaften zu überschreiben.

Proben

Weitere Informationen finden Sie in den spring-cloud-azure-testcontainers Beispielen.