我的问题是this one的一个变体。
由于我的Java Web应用程序项目需要大量的读过滤器/查询以及与GridFS等工具的接口,因此我正在努力想出一种合理的方式来按照上面的解决方案建议的方式使用MongoDB。
因此,我正在考虑在进行集成测试的同时运行MongoDB的嵌入式实例。我希望它自动启动(对于每个测试或整个套件),刷新每个测试的数据库,在结束时关闭。这些测试可能会在开发机器和CI服务器上运行,因此我的解决方案也需要使用便携。
任何对MongoDB有更多了解的人都可以帮助我了解这种方法的可行性,并且/或者推荐一些可能有助于我入门的阅读材料?
我也乐于接受人们对我如何处理这个问题的其他建议……
发布于 2019-01-18 04:54:43
这是accepted answer from @rozky的更新版本( 2019) (在Mongo和嵌入式MongoDB库中都有很多变化)。
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());
}
}
发布于 2012-03-23 05:30:37
我发现了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));
}
}
发布于 2013-10-02 18:15:46
这里有Foursquare产品Fongo。Fongo是mongo在内存中的java实现。它拦截对标准mongo-java-driver的调用,用于查找、更新、插入、删除和其他方法。它的主要用途是用于轻量级单元测试,在这种情况下,您不想启动mongo进程。
https://stackoverflow.com/questions/6437226
复制相似问题