在运行集成testing时embeddedMongoDB

我的问题是这个的一个变种。

由于我的Java Web应用程序项目需要大量的读取filter/查询以及与GridFS等工具的接口,所以我正在努力想方设法使用MongoDB。

因此,我正在考虑在集成testing的同时运行MongoDB的embedded式实例。 我希望它自动启动 (对于每个testing或整个套件),为每个testing刷新数据库 ,并在最后closures 。 这些testing可以在开发机器上运行,也可以在CI服务器上运行,所以我的解决scheme也需要是可移植的

是否有更多关于MongoDB知识的人能帮助我理解这种方法的可行性,或者可能会提供任何可能帮助我开始的阅读材料?

我也打开其他build议,人们可能会如何处理这个问题…

我发现embedded式MongoDB库看起来相当有前途,并做你所要求的。

目前支持MongoDB版本: 1.6.53.1.6 ,前提是二进制文件仍然可以从configuration的镜像中获得。

这里是一个简短的使用示例,我刚刚尝试过,它的function非常完美:

 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的调用,以查找,更新,插入,删除和其他方法。 主要用于轻量级unit testing,您不想启动一个mongo进程。

如果你使用sbt和specs2,我写了embedmongo的同类包装

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

如果你使用的是Maven,你可能会对我创build的一个插件感兴趣,这个插件包装了flapdoodle.de“embeddedmongo”API :

embedmongo – Maven的插件

它提供了一个start目标,您可以使用它来启动您想要的任何版本的MongoDB(例如,在pre-integration-test期间)以及停止MongoDB的stop目标(例如在post-integration-test )。

使用这个插件比其他的好处在于,没有要求事先安装MongoDB。 下载MongoDB二进制文件并存储在~/.embedmongo供将来构build。

使用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。 来自网站 :

从MongoDB Enterprise版本3.2.6开始,内存存储引擎是64位版本中的通用可用性(GA)的一部分。 除了一些元数据和诊断数据之外,内存存储引擎不维护任何磁盘上的数据,包括configuration数据,索引,用户凭证等。

如果你使用的是maven,你可以使用我们的http://mvnrepository.com/artifact/com.wenzani/mongodb-maven-plugin

你也可以检查这个模拟MongoDB内部JVM内存的项目。 https://github.com/thiloplanz/jmockmongo但它仍在开发中。;

不是[单单]用于unit testing,但如果你喜欢运行MongoDB(甚至集群)作为内存部署,如果你使用的是Linux,请阅读这篇博客文章。

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

不过,如果能像RavenDB一样使用它,那将会很棒。

类似于这里提到的embedmongo-maven-plugin,还有一个Gradle Mongo插件可用。

像Maven插件一样,它也包装了flapdoodle EmbeddedMongoDb API,并允许您从Gradle构build中运行Mongo的托pipe实例。

在生产中,您将使用真实的数据库。

如果你想让你的testing反映你的产品在生产中的performance,请使用一个真实的Mongo实例。

假的实现可能不像一个真正的行为一样。 testing时,应该争取正确。 执行速度第二。

在这里查看这个代码示例: https : //github.com/familysyan/embedded-mongo-integ 。 没有安装,没有依赖。 它只是一个独立于平台的ant脚本,为你做下载和设置。 它也清理你的testing后的一切。