共用方式為


Testcontainers 的 Spring Cloud Azure 支援

本文適用於:✅ 5.19.0 版

本文說明如何整合 Spring Cloud Azure 與 Testcontainers,為您的應用程式撰寫有效的整合測試。

Testcontainers 是一種開放原始碼架構,可用來提供資料庫、訊息代理程式、網頁瀏覽器,或可在 Docker 容器中執行的任何專案。 它與 JUnit 整合,可讓您撰寫可在任何測試執行之前啟動容器的測試類別。 Testcontainers 特別適合用來撰寫與實際後端服務通訊的整合測試。

spring-cloud-azure-testcontainers 連結庫現在支援下列 Azure 服務的整合測試:

服務連線

服務連線是任何遠端服務的連線。 Spring Boot 的自動設定可以取用服務連線的詳細數據,並使用它們來建立遠端服務的連線。 這樣做時,連線詳細數據優先於任何連線相關的組態屬性。

當您使用 Testcontainers 時,您可以藉由在測試類別中標註容器欄位,自動為在容器中執行的服務建立連線詳細數據。

@ServiceConnection 批注是由向 spring.factories註冊的類別 xxxContainerConnectionDetailsFactory 處理。 這些工廠會根據特定 Container 子類別或 Docker 映像名稱,建立 ConnectionDetails 豆。

下表提供 spring-cloud-azure-testcontainers JAR 中支援的連線詳細數據 Factory 類別相關信息:

線上詳細數據 Factory 類別 線上詳細數據 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 豆來完成,然後由Cosmos DB自動設定使用,覆寫任何連線相關的組態屬性。

樣品

如需詳細資訊,請參閱 GitHub 上的 azure-spring-boot-samples 存放庫