Freigeben über


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 zum Bereitstellen von Ausschütten, einfachen Instanzen von Datenbanken, Nachrichtenbrokern, Webbrowsern oder fast allen Elementen, die in einem Docker-Container ausgeführt werden können. 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. 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
EventHubsContainerConnectionDetailsFactory AzureEventHubsConnectionDetails
ServiceBusContainerConnectionDetailsFactory AzureServiceBusConnectionDetails

Einrichten von Abhängigkeiten

Die folgende Konfiguration richtet die erforderlichen Abhängigkeiten ein:

  <properties>
    <version.spring.cloud.azure>7.1.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);
    }

}

Zur Verwendung CosmosDBEmulatorContainermüssen Sie eine KeyStore 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 Einrichtung definiert automatisch eine AzureCosmosConnectionDetails Bohnen, die die Autokonfiguration von Cosmos DB verwendet, um alle verbindungsbezogenen Konfigurationseigenschaften außer Kraft zu setzen.

Proben

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