Compartilhar via


Suporte do Spring Cloud Azure para Testcontainers

Este artigo descreve como integrar o Spring Cloud Azure ao Testcontainers para gravar testes de integração eficazes para seus aplicativos.

Testcontainers é uma estrutura de software livre para fornecer instâncias descartáveis e leves de bancos de dados, agentes de mensagens, navegadores da Web ou praticamente qualquer coisa que possa ser executada em um contêiner do Docker. Ele se integra ao JUnit, permitindo que você escreva uma classe de teste que possa iniciar um contêiner antes de qualquer um dos testes ser executado. Testcontainers é especialmente útil para escrever testes de integração que conversam com um serviço de back-end real.

A biblioteca spring-cloud-azure-testcontainers agora dá suporte ao teste de integração para os seguintes serviços do Azure:

  • do Azure Cosmos DB
  • de Armazenamento de Blobs do Azure
  • de Armazenamento de Filas do Azure

Conexões de serviço

Uma conexão de serviço é uma conexão com qualquer serviço remoto. A configuração automática do Spring Boot pode consumir os detalhes de uma conexão de serviço e usá-los para estabelecer uma conexão com um serviço remoto. Ao fazer isso, os detalhes da conexão têm precedência sobre quaisquer propriedades de configuração relacionadas à conexão.

Ao usar Testcontainers, você pode criar automaticamente detalhes de conexão para um serviço em execução em um contêiner anotando o campo de contêiner na classe de teste.

A anotação @ServiceConnection é processada por classes xxxContainerConnectionDetailsFactory registradas com spring.factories. Essas fábricas criam um bean ConnectionDetails com base em uma subclasse Container específica ou no nome da imagem do Docker.

A tabela a seguir fornece informações sobre as classes de fábrica de detalhes de conexão com suporte no JAR spring-cloud-azure-testcontainers:

Classe de fábrica de detalhes da conexão Bean de detalhes da conexão
CosmosContainerConnectionDetailsFactory AzureCosmosConnectionDetails
StorageBlobContainerConnectionDetailsFactory AzureStorageBlobConnectionDetails
StorageQueueContainerConnectionDetailsFactory AzureStorageQueueConnectionDetails

Configurar dependências

A configuração a seguir configura as dependências necessárias:

  • Cosmos
  • de Armazenamento de Blobs
  • de Armazenamento de Filas
<dependency>
  <groupId>org.testcontainers</groupId>
  <artifactId>azure</artifactId>
</dependency>
<dependency>
  <groupId>com.azure.spring</groupId>
  <artifactId>spring-cloud-azure-testcontainers</artifactId>
</dependency>
<dependency>
  <groupId>com.azure.spring</groupId>
  <artifactId>spring-cloud-azure-starter-cosmos</artifactId>
</dependency>

Usar Testcontainers

O exemplo de código a seguir demonstra o uso básico de Testcontainers:

  • Cosmos
  • de Armazenamento de Blobs
  • de Armazenamento de Filas
@SpringBootTest
@Testcontainers
@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"));

    @BeforeAll
    static void setup() {
        cosmos.start();
        Path keyStoreFile = new File(tempFolder, "azure-cosmos-emulator.keystore").toPath();
        KeyStore keyStore = cosmos.buildNewKeyStore();
        try {
            keyStore.store(Files.newOutputStream(keyStoreFile.toFile().toPath()), cosmos.getEmulatorKey().toCharArray());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    
        System.setProperty("javax.net.ssl.trustStore", keyStoreFile.toString());
        System.setProperty("javax.net.ssl.trustStorePassword", cosmos.getEmulatorKey());
        System.setProperty("javax.net.ssl.trustStoreType", "PKCS12");
    }

    @Test
    void test() {
        // ...
    }
}

Para usar CosmosDBEmulatorContainer, precisamos preparar um KeyStore para TLS/SSL. Para obter mais informações, consulte Módulo do Azure do Cosmos DB na documentação de Testcontainers. Com @ServiceConnection, essa configuração permite que os feijões relacionados ao Cosmos DB no aplicativo se comuniquem com o Cosmos DB em execução dentro do contêiner do Docker gerenciado por Testcontainers. Essa ação é feita definindo automaticamente um bean AzureCosmosConnectionDetails, que é usado pela configuração automática do Cosmos DB, substituindo as propriedades de configuração relacionadas à conexão.

Amostras

Para obter mais informações, consulte o azure-spring-boot-samples repositório no GitHub.