次の方法で共有


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

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

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

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

サービス接続

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

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

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

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

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

依存関係を設定する

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

  <properties>
    <version.spring.cloud.azure>7.1.0</version.spring.cloud.azure>
  </properties>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>com.azure.spring</groupId>
        <artifactId>spring-cloud-azure-dependencies</artifactId>
        <version>${version.spring.cloud.azure}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.testcontainers</groupId>
      <artifactId>testcontainers-junit-jupiter</artifactId>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>com.azure.spring</groupId>
      <artifactId>spring-cloud-azure-testcontainers</artifactId>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>com.azure.spring</groupId>
      <artifactId>spring-cloud-azure-starter-cosmos</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>

Testcontainers の使用

次のコード例は、Testcontainers の基本的な使用方法を示しています。

@SpringBootTest(classes = CosmosTestcontainersTest.class)
@Testcontainers
@ExtendWith(SpringExtension.class)
@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"))
                .waitingFor(Wait.forHttps("/_explorer/emulator.pem").forStatusCode(200).allowInsecure())
                .withStartupTimeout(Duration.ofMinutes(3));

    @BeforeAll
    public static void setup() throws IOException, CertificateException, KeyStoreException, NoSuchAlgorithmException {
        Path keyStoreFile = new File(tempFolder, "azure-cosmos-emulator.keystore").toPath();
        KeyStore keyStore = cosmos.buildNewKeyStore();
        try (var out = Files.newOutputStream(keyStoreFile.toFile().toPath())) {
            keyStore.store(out, cosmos.getEmulatorKey().toCharArray());
        }

        System.setProperty("javax.net.ssl.trustStore", keyStoreFile.toString());
        System.setProperty("javax.net.ssl.trustStorePassword", cosmos.getEmulatorKey());
        System.setProperty("javax.net.ssl.trustStoreType", "PKCS12");
    }

    @Test
    public void test() {
        CosmosDatabaseResponse databaseResponse = client.createDatabaseIfNotExists("Azure");
        assertThat(databaseResponse.getStatusCode()).isEqualTo(201);
        CosmosContainerResponse containerResponse = client
            .getDatabase("Azure")
            .createContainerIfNotExists("ServiceContainer", "/name");
        assertThat(containerResponse.getStatusCode()).isEqualTo(201);
    }

}

CosmosDBEmulatorContainerを使用するには、TLS/SSL 用のKeyStoreを準備する必要があります。 詳細については、Testcontainers ドキュメント Cosmos DB Azure モジュール を参照してください。 @ServiceConnectionを使用すると、この構成により、アプリ内の Cosmos DB 関連の Bean が、Testcontainers によって管理される Docker コンテナー内で実行されている Cosmos DB と通信できるようになります。 このセットアップでは、 AzureCosmosConnectionDetails Bean が自動的に定義され、Cosmos DB 自動構成は接続関連の構成プロパティをオーバーライドするために使用されます。

サンプル

詳細については、 spring-cloud-azure-testcontainers の例を参照してください