1. 概要

通常、Springの自動設定システムを使用します。 @SpringBootTest SpringBootアプリケーションをテストするため。 しかし これにより、自動構成されたコンポーネントが大量にインポートされます。

ただし、アプリケーションのスライスをテストするために必要なパーツのみをロードすると、常に役立ちます。 このため、SpringBootはスライステスト用に多くの注釈を提供します。 とりわけ、これらのSpringアノテーションはそれぞれ、特定のレイヤーに必要な非常に限られた自動構成コンポーネントのセットをロードします。

このチュートリアルでは、Spring BootアプリケーションのCassandraデータベーススライスのテストに焦点を当てて、 について学ぶ @DataCassandraTest Springによって提供される注釈。

さらに、Cassandraベースの小さなSpring Bootアプリケーションの動作を見ていきます。 

また、Cassandraを本番環境で実行している場合は、独自のサーバーの実行と保守の複雑さを確実に排除し、 代わりにAstraデータベース。これはApacheCassandra上に構築されたクラウドベースのデータベースです。

2. Mavenの依存関係

Cassandra Spring Bootアプリケーションで@DataCassandraTestアノテーションを使用するには、 spring-boot-starter-test依存関係を追加する必要があります。

<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-test</artifactId>
    <version>2.5.3</version>
    <scope>test</scope>
</dependency>

Springの spring-boot-test-autoconfigure の一部です spring-boot-starter-test ライブラリであり、アプリケーションのさまざまなスライスをテストするための多くの自動構成コンポーネントが含まれています。

一般に、このテストアノテーションには次のパターンがあります。 @XXXTest.

@DataCassandraTest アノテーションは、次のSpringデータ自動構成コンポーネントをインポートします。

  • CacheAutoConfiguration
  • CassandraAutoConfiguration
  • CassandraDataAutoConfiguration
  • CassandraReactiveDataAutoConfiguration
  • CassandraReactiveRepositoriesAutoConfiguration
  • CassandraRepositoriesAutoConfiguration

3. CassandraSpringBootアプリケーションの例

これらの概念を説明するために、メインドメインが車両在庫である単純なSpringBootWebアプリケーションがあります。

シンプルにするために、このアプリケーションは基本的なものを提供します CRUD 在庫データの操作。

3.1. CassandraMavenの依存関係

春は spring-boot-starter-data-cassandra Cassandraデータのモジュール:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-cassandra</artifactId>
    <version>2.5.3</version>
</dependency>

DatastaxCassandraの依存関係も必要です java-driver-core クラスタ接続とリクエストの実行を有効にするには:

<dependency> 
    <groupId>com.datastax.oss</groupId> 
    <artifactId>java-driver-core</artifactId> 
    <version>4.13.0</version> 
</dependency>

3.2. カサンドラ構成

ここに私たちの CassandraConfig クラスはSpringを拡張します AbstractCassandraConfiguration、SpringDataCassandra構成の基本クラスです。

このSpringクラスは、Cassandraクライアントアプリケーションを次のように構成するために使用されます。 CqlSession Cassandraクラスターに接続します。

さらに、キースペース名とクラスターホストを構成できます。

@Configuration
public class CassandraConfig extends AbstractCassandraConfiguration {

    @Override
    protected String getKeyspaceName() {
        return "inventory";
    }

    @Override
    public String getContactPoints() {
        return "localhost";
    }

    @Override
    protected String getLocalDataCenter() {
         return "datacenter1";
    }
}

4. データ・モデル

以下 カサンドラクエリ言語(CQL) 名前でCassandraキースペースを作成します 在庫:

CREATE KEYSPACE inventory
WITH replication = {
    'class' : 'NetworkTopologyStrategy',
    'datacenter1' : 3
};

この CQL 名前でCassandraテーブルを作成します 車両在庫 キースペース:

use inventory;

CREATE TABLE vehicles (
   vin text PRIMARY KEY,
   year int,
   make varchar,
   model varchar
);

5. @DataCassandraTest 使用法

使い方を見てみましょう @DataCassandraTest アプリケーションのデータレイヤーをテストするための単体テストで。

The @DataCassandraTest 注釈は、スキャンを含む必要なCassandra自動構成モジュールをインポートします @テーブル@リポジトリ コンポーネント。 その結果、それは可能になります @Autowire the リポジトリ クラス。

でも、 通常のスキャンとインポートは行いません @成分@ConfigurationProperties 豆。

さらに、JUnit 4では、このアノテーションをと組み合わせて使用する必要があります @RunWith(SpringRunner.class).

5.1. 統合テストクラス

これが InventoryServiceIntegrationTest とのクラス @DataCassandraTest 注釈とリポジトリ @Autowired:

@RunWith(SpringRunner.class)
@DataCassandraTest
@Import(CassandraConfig.class)
public class InventoryServiceIntegrationTest {

    @Autowired
    private InventoryRepository repository;

    @Test
    public void givenVehiclesInDBInitially_whenRetrieved_thenReturnAllVehiclesFromDB() {
        List<Vehicle> vehicles = repository.findAllVehicles();

        assertThat(vehicles).isNotNull();
        assertThat(vehicles).isNotEmpty();
    }
}

上記の簡単なテスト方法も追加しました。

このテストの実行を容易にするために、3ノードのCassandraクラスターをセットアップするDockerComposeテストコンテナーを使用します。 

public class InventoryServiceLiveTest {

    // ...

    public static DockerComposeContainer container =
            new DockerComposeContainer(new File("src/test/resources/compose-test.yml"));

    @BeforeAll
    static void beforeAll() {
        container.start();
    }

    @AfterAll
    static void afterAll() {
        container.stop();
    }
}

compose-test.ymlファイルはGitHubプロジェクトにあります ここ.

5.2. リポジトリクラス

サンプルリポジトリクラス InventoryRepository いくつかのカスタムを定義します JPA メソッド:

@Repository
public interface InventoryRepository extends CrudRepository<Vehicle, String> {

    @Query("select * from vehicles")
    List<Vehicle> findAllVehicles();

    Optional<Vehicle> findByVin(@Param("vin") String vin);

    void deleteByVin(String vin);
}

また、このプロパティをに追加することにより、「ローカルクォーラム」の整合性レベルを定義します。これは、強力な整合性を意味します。 application.yml ファイル:

spring:
  data:
    cassandra:
      request:
        consistency: local-quorum

6. 他の @DataXXXTest 注釈

以下は、任意のアプリケーションのデータベース層をテストするための他の同様の注釈の一部です。

  • @DataJpaTest 輸入 JPA リポジトリ、 @実在物 クラスなど
  • @DataJdbcTest Spring Dataリポジトリ、JdbcTemplateなどをインポートします。
  • @DataMongoTest Spring Data MongoDBリポジトリ、Mongoテンプレート、および @書類 クラス
  • @ DataNeo4jTest Spring Data Neo4jリポジトリをインポートし、 @ノード クラス
  • @DataRedisTest SpringDataRedisリポジトリをインポートします。 @RedisHash

をご覧ください 春のドキュメント 詳細なテスト注釈と詳細情報については。

7. 結論

この記事では、その方法を学びました @DataCassandraTest アノテーションは、いくつかのSpringDataCassandra自動構成コンポーネントをロードします。 その結果、多くの不要なSpringコンテキストモジュールのロードを回避できます。

いつものように、完全なソースコードが利用可能です GitHubで.