Spring Cloud Azure-ondersteuning voor Testcontainers

In dit artikel wordt beschreven hoe u Spring Cloud Azure integreert met Testcontainers om effectieve integratietests voor uw toepassingen te schrijven.

Testcontainer is een opensource-framework voor het leveren van throwaway, lichtgewicht exemplaren van databases, berichtbrokers, webbrowsers of iets wat in een Docker-container kan worden uitgevoerd. Het integreert met JUnit, zodat u een testklasse kunt schrijven die een container kan starten voordat een van de tests wordt uitgevoerd. Testcontainer is vooral handig voor het schrijven van integratietests die communiceren met een echte back-endservice.

De spring-cloud-azure-testcontainers-bibliotheek biedt nu ondersteuning voor integratietests voor de volgende Azure-services:

Serviceverbindingen

Een serviceverbinding is een verbinding met elke externe service. De automatische configuratie van Spring Boot kan de details van een serviceverbinding verbruiken en deze gebruiken om een verbinding met een externe service tot stand te brengen. Als u dit doet, hebben de verbindingsgegevens voorrang op eventuele verbindingsgerelateerde configuratie-eigenschappen.

Wanneer u Testcontainers gebruikt, kunt u automatisch verbindingsgegevens maken voor een service die in een container wordt uitgevoerd door aantekeningen te maken aan het containerveld in de testklasse.

xxxContainerConnectionDetailsFactory klassen zijn geregistreerd bij spring.factories. Deze factories creëren een ConnectionDetails bean op basis van een specifieke Container-subklasse of de naam van de Docker-image.

De volgende tabel biedt informatie over de fabrieksklassen van verbindingsgegevens die worden ondersteund in de spring-cloud-azure-testcontainers JAR:

Fabrieksklasse verbindingsdetails Verbindingsgegevens van de component
CosmosContainerConnectionDetailsFactory AzureCosmosConnectionDetails
StorageBlobContainerConnectionDetailsFactory AzureStorageBlobConnectionDetails
StorageQueueContainerConnectionDetailsFactory AzureStorageQueueConnectionDetails
EventHubsContainerConnectionDetailsFactory AzureEventHubsConnectionDetails
ServiceBusContainerConnectionDetailsFactory AzureServiceBusConnectionDetails

Afhankelijkheden instellen

Met de volgende configuratie worden de vereiste afhankelijkheden ingesteld:

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

Testcontainers gebruiken

In het volgende codevoorbeeld ziet u het basisgebruik van 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);
    }

}

Als u wilt gebruiken CosmosDBEmulatorContainer, moet u een KeyStore voorbereiden op TLS/SSL. Zie Cosmos DB Azure Module in de documentatie voor Testcontainers voor meer informatie. Met @ServiceConnection maakt deze configuratie het mogelijk dat Cosmos DB-gerelateerde beans in de app communiceren met Cosmos DB die draait in de door Testcontainers beheerde Docker-container. Deze installatie definieert automatisch een AzureCosmosConnectionDetails bean, die door de automatische configuratie van Cosmos DB wordt gebruikt om eventuele configuratie-eigenschappen met betrekking tot verbindingen te overschrijven.

Voorbeelden

Zie de spring-cloud-azure-testcontainers voorbeelden voor meer informatie.