web-dev-qa-db-ja.com

統合テストの実行時の組み込みMongoDB

私の質問は this one のバリエーションです。

私のJava Webアプリプロジェクトには、多くの読み取りフィルター/クエリとGridFSなどのツールとのインターフェイスが必要なので、上記のソリューションが示す方法でMongoDBを採用する賢明な方法を考えるのに苦労しています。

したがって、統合テストと一緒にMongoDBの埋め込みインスタンスを実行することを検討しています。 自動的に起動するようにしたい(各テストまたはスイート全体)、データベースをフラッシュするすべてのテスト、およびshut down最後に。これらのテストは、CIサーバーだけでなく開発マシンでも実行される可能性があるため、私のソリューションもportableである必要があります。

MongoDBについてより多くの知識を持っている人は、このアプローチの実現可能性を理解するのに役立ちますか、そして/またはおそらく私が始めるのに役立つ読書資料を提案できますか?

また、この問題にどのように取り組むことができるかについて、人々が持つかもしれない他の提案を受け入れています...

107
seanhodges

@ rozkyからの受け入れられた回答 (MongoとEmbedded MongoDBライブラリの両方で多くが変更されました)の更新された(2019年版)バージョンです。

package com.example.mongo;

import com.mongodb.BasicDBObject;
import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import de.flapdoodle.embed.mongo.MongodExecutable;
import de.flapdoodle.embed.mongo.MongodProcess;
import de.flapdoodle.embed.mongo.MongodStarter;
import de.flapdoodle.embed.mongo.config.IMongodConfig;
import de.flapdoodle.embed.mongo.config.MongodConfigBuilder;
import de.flapdoodle.embed.mongo.config.Net;
import de.flapdoodle.embed.mongo.distribution.Version;
import de.flapdoodle.embed.process.runtime.Network;
import Java.util.Date;
import org.junit.After;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;

public class EmbeddedMongoTest
{
    private static final String DATABASE_NAME = "embedded";

    private MongodExecutable mongodExe;
    private MongodProcess mongod;
    private MongoClient mongo;

    @Before
    public void beforeEach() throws Exception {
        MongodStarter starter = MongodStarter.getDefaultInstance();
        String bindIp = "localhost";
        int port = 12345;
        IMongodConfig mongodConfig = new MongodConfigBuilder()
        .version(Version.Main.PRODUCTION)
        .net(new Net(bindIp, port, Network.localhostIsIPv6()))
        .build();
        this.mongodExe = starter.prepare(mongodConfig);
        this.mongod = mongodExe.start();
        this.mongo = new MongoClient(bindIp, port);
    }

    @After
    public void afterEach() throws Exception {
        if (this.mongod != null) {
            this.mongod.stop();
            this.mongodExe.stop();
        }
    }

    @Test
    public void shouldCreateNewObjectInEmbeddedMongoDb() {
        // given
        MongoDatabase db = mongo.getDatabase(DATABASE_NAME);
        db.createCollection("testCollection");
        MongoCollection<BasicDBObject> col = db.getCollection("testCollection", BasicDBObject.class);

        // when
        col.insertOne(new BasicDBObject("testDoc", new Date()));

        // then
        assertEquals(1L, col.countDocuments());
    }

}
5
Collin Krawll

私は Embedded MongoDB ライブラリを見つけました。これは非常に有望に見え、あなたが求めていることをします。

現在、MongoDBのバージョンをサポートしています:1.6.5から3.1.6。ただし、構成されたミラーからバイナリを引き続き使用できます。

ここに使用例がありますが、私が試したところ、完璧に機能します:

public class EmbeddedMongoTest {
    private static final String DATABASE_NAME = "embedded";

    private MongodExecutable mongodExe;
    private MongodProcess mongod;
    private Mongo mongo;

    @Before
    public void beforeEach() throws Exception {
        MongoDBRuntime runtime = MongoDBRuntime.getDefaultInstance();
        mongodExe = runtime.prepare(new MongodConfig(Version.V2_3_0, 12345, Network.localhostIsIPv6()));
        mongod = mongodExe.start();
        mongo = new Mongo("localhost", 12345);
    }

    @After
    public void afterEach() throws Exception {
        if (this.mongod != null) {
            this.mongod.stop();
            this.mongodExe.stop();
        }
    }

    @Test
    public void shouldCreateNewObjectInEmbeddedMongoDb() {
        // given
        DB db = mongo.getDB(DATABASE_NAME);
        DBCollection col = db.createCollection("testCollection", new BasicDBObject());

        // when
        col.save(new BasicDBObject("testDoc", new Date()));

        // then
        assertThat(col.getCount(), Matchers.is(1L));
    }
}
94
rozky

Foursquare製品があります Fongo 。 Fongoは、mongoのメモリ内Java実装です。検索、更新、挿入、削除、およびその他のメソッドのための標準mongo-Java-driverへの呼び出しをインターセプトします。主な用途は、mongoプロセスを起動したくない軽量の単体テストです。

18
zlob

Mavenを使用している場合は、 flapdoodle.de 'embedded mongo' API :をラップするプラグインに興味があるかもしれません。

embedmongo-maven-plugin

これは、必要なMongoDBの任意のバージョンを起動するために使用できるstart目標(pre-integration-test中など)と、MongoDBを停止するstop目標(post-integration-test中など)を提供します。

他のプラグインよりもこのプラグインを使用することの本当の利点は、MongoDBを事前にインストールする必要がないことです。 MongoDBバイナリは、将来のビルドのために~/.embedmongoにダウンロードされて保存されます。

7
joelittlejohn

Sbtとspecs2を使用している場合、embedmongoに同じ種類のラッパーを作成しました。

https://github.com/athieriot/specs2-embedmongo

7

spring-boot 1.3では、EmbeddedMongoAutoConfigurationを使用できます

pom.xml

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.3.2.RELEASE</version>
</parent>
 ...
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-mongodb</artifactId>
    </dependency>
    <dependency>
        <groupId>de.flapdoodle.embed</groupId>
        <artifactId>de.flapdoodle.embed.mongo</artifactId>
        <version>${embedded-mongo.version}</version>
    </dependency>

MongoConfig

@Configuration
@EnableAutoConfiguration(exclude = { EmbeddedMongoAutoConfiguration.class })
public class MongoConfig{
}
4
panser

バージョン3.2.6の時点で、メモリ内でMongoDBを実行できます。 site から:

MongoDB Enterpriseバージョン3.2.6以降、メモリ内ストレージエンジンは64ビットビルドの一般的な可用性(GA)の一部です。一部のメタデータと診断データを除き、インメモリストレージエンジンは、構成データ、インデックス、ユーザー資格情報などを含むディスク上のデータを保持しません。

3
Irwin

JVMメモリ内でMongoDBをシミュレートするこのプロジェクトを確認することもできます。 https://github.com/thiloplanz/jmockmongo しかし、まだ開発中です。

2

Mavenを使用している場合は、 http://mvnrepository.com/artifact/com.wenzani/mongodb-maven-plugin を使用できます。

2
markdsievers

ユニットテスト用ではありませんが、Linuxを使用している場合にMongoDB(クラスターを含む)をインメモリ展開として実行する場合は、このブログ投稿をお読みください。

http://edgystuff.tumblr.com/post/49304254688

ただし、RavenDBのようにすぐに使用できるのは素晴らしいことです。

2
Tamir

ここで説明したembedmongo-maven-pluginと同様に、 Gradle Mongo Plugin も使用可能です。

Mavenプラグインと同様に、 flapdoodle EmbeddedMongoDb api もラップし、GradleビルドからMongoのマネージドインスタンスを実行できます。

1
Robert Taylor

次のコード例を確認してください: https://github.com/familysyan/embedded-mongo-integ 。インストールも依存関係もありません。これは、プラットフォームに依存しないAntスクリプトであり、ダウンロードとセットアップを行います。また、テスト後にすべてをクリーンアップします。

0
Edmond