Embedded MongoDB when running integration tests Embedded MongoDB when running integration tests mongodb mongodb

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());    }}