私の質問は this one のバリエーションです。
私のJava Webアプリプロジェクトには、多くの読み取りフィルター/クエリとGridFSなどのツールとのインターフェイスが必要なので、上記のソリューションが示す方法でMongoDBを採用する賢明な方法を考えるのに苦労しています。
したがって、統合テストと一緒にMongoDBの埋め込みインスタンスを実行することを検討しています。 自動的に起動するようにしたい(各テストまたはスイート全体)、データベースをフラッシュするすべてのテスト、およびshut down最後に。これらのテストは、CIサーバーだけでなく開発マシンでも実行される可能性があるため、私のソリューションもportableである必要があります。
MongoDBについてより多くの知識を持っている人は、このアプローチの実現可能性を理解するのに役立ちますか、そして/またはおそらく私が始めるのに役立つ読書資料を提案できますか?
また、この問題にどのように取り組むことができるかについて、人々が持つかもしれない他の提案を受け入れています...
@ 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());
}
}
私は 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));
}
}
Foursquare製品があります Fongo 。 Fongoは、mongoのメモリ内Java実装です。検索、更新、挿入、削除、およびその他のメソッドのための標準mongo-Java-driverへの呼び出しをインターセプトします。主な用途は、mongoプロセスを起動したくない軽量の単体テストです。
Mavenを使用している場合は、 flapdoodle.de 'embedded mongo' API :をラップするプラグインに興味があるかもしれません。
これは、必要なMongoDBの任意のバージョンを起動するために使用できるstart
目標(pre-integration-test
中など)と、MongoDBを停止するstop
目標(post-integration-test
中など)を提供します。
他のプラグインよりもこのプラグインを使用することの本当の利点は、MongoDBを事前にインストールする必要がないことです。 MongoDBバイナリは、将来のビルドのために~/.embedmongo
にダウンロードされて保存されます。
Sbtとspecs2を使用している場合、embedmongoに同じ種類のラッパーを作成しました。
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{
}
バージョン3.2.6の時点で、メモリ内でMongoDBを実行できます。 site から:
MongoDB Enterpriseバージョン3.2.6以降、メモリ内ストレージエンジンは64ビットビルドの一般的な可用性(GA)の一部です。一部のメタデータと診断データを除き、インメモリストレージエンジンは、構成データ、インデックス、ユーザー資格情報などを含むディスク上のデータを保持しません。
JVMメモリ内でMongoDBをシミュレートするこのプロジェクトを確認することもできます。 https://github.com/thiloplanz/jmockmongo しかし、まだ開発中です。
Mavenを使用している場合は、 http://mvnrepository.com/artifact/com.wenzani/mongodb-maven-plugin を使用できます。
ユニットテスト用ではありませんが、Linuxを使用している場合にMongoDB(クラスターを含む)をインメモリ展開として実行する場合は、このブログ投稿をお読みください。
http://edgystuff.tumblr.com/post/49304254688
ただし、RavenDBのようにすぐに使用できるのは素晴らしいことです。
ここで説明したembedmongo-maven-pluginと同様に、 Gradle Mongo Plugin も使用可能です。
Mavenプラグインと同様に、 flapdoodle EmbeddedMongoDb api もラップし、GradleビルドからMongoのマネージドインスタンスを実行できます。
次のコード例を確認してください: https://github.com/familysyan/embedded-mongo-integ 。インストールも依存関係もありません。これは、プラットフォームに依存しないAntスクリプトであり、ダウンロードとセットアップを行います。また、テスト後にすべてをクリーンアップします。