Embedded MongoDB when running integration tests
I have found Embedded MongoDB library which looks quite promising and does what you have asked for.
Currently supports MongoDB versions: 1.6.5
to 3.1.6
, provided the binaries are still available from the configured mirror.
Here is short example of use, which I have just tried and it works perfectly:
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)); }}
There is Foursquare product Fongo.Fongo is an in-memory java implementation of mongo. It intercepts calls to the standard mongo-java-driver for finds, updates, inserts, removes and other methods. The primary use is for lightweight unit testing where you don't want to spin up a mongo process.
Here's an updated (for 2019) version of the accepted answer from @rozky (a lot has been changed in both the Mongo and Embedded MongoDB libraries).
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()); }}