Embedded MongoDBとのSpring Boot統合テスト

データ]** テスト中

  • リンク:/tag/mongodb/[MongoDB]

1概要

このチュートリアルでは、Flapdoodleの組み込みMongoDBソリューションとSpring Bootを併用してMongoDB統合テストを円滑に実行する方法を学習します。

  • MongoDBは人気のあるNoSQL文書データベース** です。高いスケーラビリティ、組み込みの共有化、および優れたコミュニティサポートにより、多くの開発者によって「NoSQLストレージ」とみなされることがよくあります。

他の持続技術と同様に、データベースの他のアプリケーションとの統合を簡単にテストできることが重要です。

ありがたいことに、Spring Bootではそのようなテストを簡単に書くことができます。

2 Mavenの依存関係

まず、Bootプロジェクト用にMavenの親を設定しましょう。

親のおかげで Mavenの依存関係ごとに手動でバージョンを定義する必要はありません

私たちは当然Spring Bootを使うつもりです。

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.3.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

最新のブートバージョンhttps://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22org.springframework.boot%22%20AND%20a%3A%22spring-boot-starter-を見つけることができます。親%22[ここ]。

Spring Bootの親を追加したので、バージョンを指定せずに必要な依存関係を追加できます。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

spring-boot-starter-data-mongodb はMongoDBのSpringサポートを有効にします。

<dependency>
    <groupId>de.flapdoodle.embed</groupId>
    <artifactId>de.flapdoodle.embed.mongo</artifactId>
    <scope>test</scope>
</dependency>

de.flapdoodle.embed.mongo は、統合テスト用の組み込みMongoDBを提供します。

** 3埋め込みMongoDBを使用したテスト

**

このセクションでは、Spring Bootテストと手動テストの2つのシナリオについて説明します。

** 3.1. 春のブーツテスト

**

de.flapdoodle.embed.mongo 依存関係 を追加すると、テストの実行時にSpring Bootは自動的に組み込みMongoDB をダウンロードして起動しようとします。

パッケージは各バージョンごとに一度だけダウンロードされるので、その後のテストははるかに速くなります。

この段階で、サンプルJUnit 5統合テストを開始して合格することができます。

@DataMongoTest
@ExtendWith(SpringExtension.class)
public class MongoDbSpringIntegrationTest {
    @DisplayName("given object to save"
        + " when save object using MongoDB template"
        + " then object is saved")
    @Test
    public void test(@Autowired MongoTemplate mongoTemplate) {
       //given
        DBObject objectToSave = BasicDBObjectBuilder.start()
            .add("key", "value")
            .get();

       //when
        mongoTemplate.save(objectToSave, "collection");

       //then
        assertThat(mongoTemplate.findAll(DBObject.class, "collection")).extracting("key")
            .containsOnly("value");
    }
}

ご覧のとおり、埋め込みデータベースはSpringによって自動的に起動されたもので、コンソールにも記録されているはずです。

...Starting MongodbExampleApplicationTests on arroyo with PID 10413...

** 3.2. 手動設定テスト

**

Spring Bootは自動的に組み込みデータベースを起動して設定し、それから MongoTemplate インスタンスを注入します。ただし、 埋め込みMongoデータベースを手動で設定する必要がある場合があります (特定のDBバージョンをテストする場合など)。

次のスニペットは、埋め込みMongoDBインスタンスを手動で構成する方法を示しています。これは前回のSpringテストとほぼ同じです。

class ManualEmbeddedMongoDbIntegrationTest {
    private MongodExecutable mongodExecutable;
    private MongoTemplate mongoTemplate;

    @AfterEach
    void clean() {
        mongodExecutable.stop();
    }

    @BeforeEach
    void setup() throws Exception {
        String ip = "localhost";
        int port = 27017;

        IMongodConfig mongodConfig = new MongodConfigBuilder().version(Version.Main.PRODUCTION)
            .net(new Net(ip, port, Network.localhostIsIPv6()))
            .build();

        MongodStarter starter = MongodStarter.getDefaultInstance();
        mongodExecutable = starter.prepare(mongodConfig);
        mongodExecutable.start();
        mongoTemplate = new MongoTemplate(new MongoClient(ip, port), "test");
    }

    @DisplayName("given object to save"
        + " when save object using MongoDB template"
        + " then object is saved")
    @Test
    void test() throws Exception {
       //given
        DBObject objectToSave = BasicDBObjectBuilder.start()
            .add("key", "value")
            .get();

       //when
        mongoTemplate.save(objectToSave, "collection");

       //then
        assertThat(mongoTemplate.findAll(DBObject.class, "collection")).extracting("key")
            .containsOnly("value");
    }
}

手動で設定した組み込みデータベースを使用するように設定された MongoTemplate beanを素早く作成し、Springコンテナ内に登録するだけで、たとえば new MongoTemplate(new MongoClient(bindIp、return)を返す @TestConfiguration with @ @ Bean メソッドを作成するだけです。ポート)、「テスト」)__。

より多くの例は、公式のFlapdoodleのhttps://github.com/flapdoodle-oss/de.flapdoodle.embed.mongo[GitHub repository]にあります。

3.3. ロギング

これら2つのプロパティを src/test/resources/application.propertes ファイルに追加することで、統合テストの実行時にMongoDBのログメッセージを設定できます。

logging.level.org.springframework.boot.autoconfigure.mongo.embedded
logging.level.org.mongodb

たとえば、ロギングを無効にするには、単に値を off に設定します。

logging.level.org.springframework.boot.autoconfigure.mongo.embedded=off
logging.level.org.mongodb=off

3.4. 実稼働データベースを実稼働で使用する

<scope> test </scope> を使用して de.flapdoodle.embed.mongo 依存関係を追加したので、本番環境で実行するときに埋め込みデータベースを無効にする必要はありません 。 MongoDBの接続の詳細(ホストとポートなど)を指定するだけで十分です。

テストの外で組み込みDBを使用するには、アクティブなプロファイルに応じて正しい MongoClient (組み込みまたは本番)を登録するSpringプロファイルを使用できます。

プロダクション依存関係の範囲を <scope> runtime </scope> に変更する必要もあります。

4.組み込みテストの論争

組み込みデータベースを使用することは、最初は素晴らしいアイデアのように見えるかもしれません。

確かに、次のような分野でアプリケーションが正しく動作するかどうかをテストしたい場合は、良い方法です。

  • Object <→ドキュメントマッピング設定

  • カスタム永続ライフサイクルイベントリスナー(参照

AbstractMongoEventListener ) ** パーシスタンスレイヤと直接連携しているコードのロジック

残念ながら、** 組み込みサーバーを使用することを「完全統合テスト」と見なすことはできません。 Flapdoodleの組み込みMongoDBは、正式なMongoDB製品ではありません。したがって、本番環境とまったく同じように動作するとは限りません。

できるだけ本番環境に近い環境で通信テストを実行する場合は、Dockerなどの環境コンテナを使用することをお勧めします。

Dockerの詳細については、前の記事https://www.baeldung.com/dockerizing-spring-boot-application[ここ]をお読みください。

5結論

Spring Bootは、適切なドキュメントマッピングとデータベース統合を検証するテストを実行することを非常に簡単にします。適切なMaven依存関係を追加することで、Spring Bootの統合テストですぐにMongoDBコンポーネントを使用することができます。

私たちは、 埋め込まれたMongoDBサーバーを「実際の」サーバー の代わりと見なすことはできないことを覚えておく必要があります。

すべての例の完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/spring-boot/src/test/java/com/baeldung/mongodb[GitHubで入手可能]です。

前の投稿:Java Web Weekly 2
次の投稿:REST APIのバージョン管理