Compartir vía


Compatibilidad de Spring Cloud con Azure para Testcontainers

Este artículo se aplica a:✅ versión 5.19.0

En este artículo se describe cómo integrar Spring Cloud Azure con Testcontainers para escribir pruebas de integración eficaces para las aplicaciones.

testcontainers es un marco de código abierto para proporcionar instancias ligeras de bases de datos, agentes de mensajes, exploradores web o casi cualquier cosa que se pueda ejecutar en un contenedor de Docker. Se integra con JUnit, lo que le permite escribir una clase de prueba que pueda iniciar un contenedor antes de que se ejecute cualquiera de las pruebas. Testcontainers es especialmente útil para escribir pruebas de integración que hablan con un servicio back-end real.

La biblioteca de spring-cloud-azure-testcontainers ahora admite pruebas de integración para los siguientes servicios de Azure:

  • de Azure Cosmos DB
  • de Azure Blob Storage
  • de Azure Queue Storage

Conexiones de servicio

Una conexión de servicio es una conexión a cualquier servicio remoto. La configuración automática de Spring Boot puede consumir los detalles de una conexión de servicio y usarlas para establecer una conexión a un servicio remoto. Al hacerlo, los detalles de conexión tienen prioridad sobre las propiedades de configuración relacionadas con la conexión.

Al usar Testcontainers, puede crear automáticamente detalles de conexión para un servicio que se ejecuta en un contenedor anotando el campo contenedor en la clase de prueba.

La anotación @ServiceConnection se procesa mediante xxxContainerConnectionDetailsFactory clases registradas con spring.factories. Estas factorías crean un bean de ConnectionDetails en función de una subclase Container específica o el nombre de la imagen de Docker.

En la tabla siguiente se proporciona información sobre las clases de generador de detalles de conexión admitidas en el archivo JAR de spring-cloud-azure-testcontainers:

Clase de generador de detalles de conexión Bean de detalles de conexión
CosmosContainerConnectionDetailsFactory AzureCosmosConnectionDetails
StorageBlobContainerConnectionDetailsFactory AzureStorageBlobConnectionDetails
StorageQueueContainerConnectionDetailsFactory AzureStorageQueueConnectionDetails

Configuración de dependencias

La siguiente configuración configura las dependencias necesarias:

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

Uso de Testcontainers

En el ejemplo de código siguiente se muestra el uso básico de Testcontainers:

@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, es necesario preparar un KeyStore para TLS/SSL. Para más información, consulte módulo de Azure de Cosmos DB en la documentación de Testcontainers. Con @ServiceConnection, esta configuración permite que los frijoles relacionados con Cosmos DB de la aplicación se comuniquen con Cosmos DB que se ejecutan dentro del contenedor de Docker administrado por Testcontainers. Esta acción se realiza mediante la definición automática de un AzureCosmosConnectionDetails bean, que después se usa en la configuración automática de Cosmos DB, reemplazando las propiedades de configuración relacionadas con la conexión.

Muestras

Para más información, consulte el repositorio de azure-spring-boot-samples en GitHub.