Dela via


Stöd för Spring Cloud Azure för Testcontainers

Den här artikeln beskriver hur du integrerar Spring Cloud Azure med Testcontainers för att skriva effektiva integreringstester för dina program.

Testcontainer är ett ramverk med öppen källkod för att tillhandahålla slängbara, enkla instanser av databaser, meddelandeköer, webbläsare eller nästan allt som kan köras i en Docker-container. Den integreras med JUnit så att du kan skriva en testklass som kan starta en container innan någon av testerna körs. Testcontainer är särskilt användbart för att skriva integrationstester som kommunicerar med en riktig serverdelstjänst.

spring-cloud-azure-testcontainers-biblioteket stöder nu integreringstestning för följande Azure-tjänster:

Tjänstanslutningar

En tjänstanslutning är en anslutning till alla fjärrtjänster. Den automatiska konfigurationen av Spring Boot kan använda information om en tjänstanslutning och använda dem för att upprätta en anslutning till en fjärrtjänst. När du gör det har anslutningsinformationen företräde framför eventuella anslutningsrelaterade konfigurationsegenskaper.

När du använder Testcontainers kan du automatiskt skapa anslutningsinformation för en tjänst som körs i en container genom att kommentera containerfältet i testklassen.

xxxContainerConnectionDetailsFactory Klasser registreras med spring.factories. Dessa fabriker skapar en ConnectionDetails böna baserat på en specifik Container underklass eller Docker-avbildningsnamnet.

Följande tabell innehåller information om de fabriksklasser för anslutningsinformation som stöds i spring-cloud-azure-testcontainers JAR:

Fabriksklass för anslutningsinformation Bean för anslutningsinformation
CosmosContainerConnectionDetailsFactory AzureCosmosConnectionDetails
StorageBlobContainerConnectionDetailsFactory AzureStorageBlobConnectionDetails
StorageQueueContainerConnectionDetailsFactory AzureStorageQueueConnectionDetails
EventHubsContainerConnectionDetailsFactory AzureEventHubsConnectionDetails
ServiceBusContainerConnectionDetailsFactory AzureServiceBusConnectionDetails

Konfigurera beroenden

Följande konfiguration konfigurerar nödvändiga beroenden:

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

Använda Testcontainers

Följande kodexempel visar den grundläggande användningen av Testcontainers:

@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);
    }

}

Om du vill använda CosmosDBEmulatorContainermåste du förbereda en KeyStore för TLS/SSL. Mer information finns i Cosmos DB Azure Module i dokumentationen om Testcontainers. Med @ServiceConnectiongör den här konfigurationen att Cosmos DB-relaterade bönor i appen kan kommunicera med Cosmos DB som körs i den Testcontainers-hanterade Docker-containern. Den här konfigurationen definierar automatiskt en AzureCosmosConnectionDetails böna, som cosmos DB-autokonfigurationen sedan använder för att åsidosätta anslutningsrelaterade konfigurationsegenskaper.

Prover

Mer information finns i exemplenspring-cloud-azure-testcontainers.