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 リポジトリ