Delen via


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 factory's maken een ConnectionDetails bean op basis van een specifieke Container subklasse of de naam van de Docker-installatiekopieën.

De volgende tabel bevat informatie over de factoryklassen voor verbindingsgegevens die worden ondersteund in de spring-cloud-azure-testcontainers JAR:

Fabrieksklasse verbindingsdetails Verbindingsdetails van de bean
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.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>

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 @ServiceConnectionkan met deze configuratie cosmos DB-gerelateerde bonen in de app communiceren met Cosmos DB die wordt uitgevoerd 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.

Monsters

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