Spring Cloud Azure 对 Testcontainers 的支持

本文 适用于:✅ 版本 5.19.0

本文介绍如何将 Spring Cloud Azure 与 Testcontainers 集成, 为应用程序编写有效的集成测试。

Testcontainers 是一个开源框架,用于提供数据库、消息代理、Web 浏览器的轻量级实例,或可在 Docker 容器中运行的任何内容。 它与 JUnit 集成,使你能够编写可在任何测试运行之前启动容器的测试类。 Testcontainers 对于编写与真实后端服务通信的集成测试特别有用。

spring-cloud-azure-testcontainers 库现在支持以下 Azure 服务的集成测试:

服务连接

服务连接是与任何远程服务的连接。 Spring Boot 的自动配置可以使用服务连接的详细信息,并使用它们建立与远程服务的连接。 执行此操作时,连接详细信息优先于任何与连接相关的配置属性。

使用 Testcontainers 时,可以通过在测试类中注释容器字段来自动为在容器中运行的服务创建连接详细信息。

@ServiceConnection 批注由注册到 spring.factoriesxxxContainerConnectionDetailsFactory 类进行处理。 这些工厂基于特定的 Container 子类或 Docker 映像名称创建 ConnectionDetails bean。

下表提供有关 spring-cloud-azure-testcontainers JAR 中支持的连接详细信息工厂类的信息:

连接详细信息工厂类 连接详细信息 bean
CosmosContainerConnectionDetailsFactory AzureCosmosConnectionDetails
StorageBlobContainerConnectionDetailsFactory AzureStorageBlobConnectionDetails
StorageQueueContainerConnectionDetailsFactory AzureStorageQueueConnectionDetails

设置依赖项

以下配置设置所需的依赖项:

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

使用 Testcontainers

以下代码示例演示 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() {
        // ...
    }
}

若要使用 CosmosDBEmulatorContainer,我们需要为 TLS/SSL 准备 KeyStore。 有关详细信息,请参阅 Testcontainers 文档中 Cosmos DB Azure 模块。 借助 @ServiceConnection,此配置使应用中的 Cosmos DB 相关豆类能够与 Testcontainers 托管 Docker 容器中运行的 Cosmos DB 通信。 此操作通过自动定义 AzureCosmosConnectionDetails bean(然后由 Cosmos DB 自动配置使用),覆盖任何与连接相关的配置属性来完成此操作。

样品

有关详细信息,请参阅 GitHub 上的 azure-spring-boot-samples 存储库