Embedded MongoDBとのSpring Boot統合テスト

組み込みMongoDBを使用したSpring Boot統合テスト

1. 概要

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

MongoDB is a popular NoSQL document database。 高いスケーラビリティ、組み込みのシャーディング、優れたコミュニティサポートのおかげで、多くの開発者は「theNoSQLストレージ」と見なすことがよくあります。

他の永続化テクノロジーと同様に、it’s critical to be able to test database integration with the rest of our application easily。 ありがたいことに、Spring Bootを使用すると、この種のテストを簡単に作成できます。

2. Mavenの依存関係

まず、BootプロジェクトのMaven親をセットアップしましょう。

親%(t​​0)sに感謝します。

当然、SpringBootを使用します。


    org.springframework.boot
    spring-boot-starter-parent
    2.0.3.RELEASE
     

最新のブートバージョンhereを見つけることができます。

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


    org.springframework.boot
    spring-boot-starter-data-mongodb

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


    de.flapdoodle.embed
    de.flapdoodle.embed.mongo
    test

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

3. EmbeddedMongoDBを使用したテスト

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

3.1. 春のブートテスト

テストの実行時にde.flapdoodle.embed.mongo依存関係Spring Boot will automatically try to download and start the embedded MongoDBを追加した後。

パッケージはバージョンごとに1回だけダウンロードされるため、後続のテストははるかに高速に実行されます。

この段階で、サンプルの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インスタンスを挿入します。 ただし、sometimes we might need to configure embedded Mongo database manually(たとえば、特定の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をすばやく作成し、たとえば、@Beanメソッドを使用して@TestConfigurationを作成するだけで、Springコンテナー内に登録できることに注意してください。 new MongoTemplate(new MongoClient(bindIp, port), “test”)

その他の例は、公式のFlapdoodleの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>there’s no need to disable embedded database when running on productionを使用してde.flapdoodle.embed.mongo依存関係を追加したため。 やらなければならないことは、MongoDB接続の詳細(ホストやポートなど)を指定するだけです。

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

また、本番環境の依存関係の範囲を<scope>runtime</scope>に変更する必要があります。

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

組み込みデータベースの使用は、最初は素晴らしいアイデアのように見えるかもしれません。 実際、次のような領域でアプリケーションが正しく動作するかどうかをテストする場合に適したアプローチです。

  • オブジェクト<→ドキュメントマッピング構成

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

  • 永続層で直接動作するコードのロジック

残念ながら、using an embedded server cannot be considered as “full integration testing”。 Flapdoodleの組み込みMongoDBは、公式のMongoDB製品ではありません。 したがって、実稼働環境とまったく同じように動作することを確認できません。

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

Dockerの詳細については、以前の記事hereを参照してください。

5. 結論

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

embedded MongoDB server cannot be considered a replacement for a “real” serverであることを覚えておく必要があります。

すべての例の完全なソースコードは、over on GitHubで入手できます。