次の方法で共有


Testcontainers に対する Spring Cloud Azure のサポート

この記事の対象:✅ バージョン 5.19.0

この記事では、Spring Cloud Azure と Testcontainers を統合して、アプリケーションの効果的な統合テストを記述する方法について説明します。

Testcontainers は、データベース、メッセージ ブローカー、Web ブラウザー、または Docker コンテナーで実行できるあらゆるもののについて、スローナウェイで軽量なインスタンスを提供するためのオープンソース フレームワークです。 JUnit と統合されているため、テストの実行前にコンテナーを起動できるテスト クラスを記述できます。 Testcontainers は、実際のバックエンド サービスと通信する統合テストを記述する場合に特に便利です。

spring-cloud-azure-testcontainers ライブラリでは、次の Azure サービスの統合テストがサポートされるようになりました。

  • Azure Cosmos DB の
  • Azure Blob Storage の
  • Azure Queue Storage の

サービス接続

サービス接続は、任意のリモート サービスへの接続です。 Spring Boot の自動構成では、サービス接続の詳細を使用して、リモート サービスへの接続を確立できます。 その場合、接続に関連する構成プロパティよりも接続の詳細が優先されます。

Testcontainers を使用する場合、テスト クラスのコンテナー フィールドに注釈を付けることで、コンテナーで実行されているサービスの接続の詳細を自動的に作成できます。

@ServiceConnection 注釈は、spring.factoriesに登録 xxxContainerConnectionDetailsFactory クラスによって処理されます。 これらのファクトリは、特定の Container サブクラスまたは Docker イメージ名に基づいて ConnectionDetails Bean を作成します。

次の表に、spring-cloud-azure-testcontainers JAR でサポートされている接続の詳細ファクトリ クラスに関する情報を示します。

接続の詳細ファクトリ クラス 接続の詳細 Bean
CosmosContainerConnectionDetailsFactory AzureCosmosConnectionDetails
StorageBlobContainerConnectionDetailsFactory AzureStorageBlobConnectionDetails
StorageQueueContainerConnectionDetailsFactory AzureStorageQueueConnectionDetails

依存関係を設定する

次の構成では、必要な依存関係が設定されます。

  • Cosmos
  • Blob Storage の
  • キュー ストレージ の
<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 の基本的な使用方法を示しています。

  • Cosmos
  • Blob Storage の
  • キュー ストレージ の
@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 関連の Bean が、Testcontainers によって管理される Docker コンテナー内で実行されている Cosmos DB と通信できるようになります。 このアクションは、AzureCosmosConnectionDetails Bean を自動的に定義し、Cosmos DB 自動構成によって使用され、接続関連の構成プロパティをオーバーライドすることによって実行されます。

サンプル

詳細については、GitHub の azure-spring-boot-samples リポジトリ を参照してください。