在运行集成testing时embeddedMongoDB
我的问题是这个的一个变种。
由于我的Java Web应用程序项目需要大量的读取filter/查询以及与GridFS等工具的接口,所以我正在努力想方设法使用MongoDB。
因此,我正在考虑在集成testing的同时运行MongoDB的embedded式实例。 我希望它自动启动 (对于每个testing或整个套件),为每个testing刷新数据库 ,并在最后closures 。 这些testing可以在开发机器上运行,也可以在CI服务器上运行,所以我的解决scheme也需要是可移植的 。
是否有更多关于MongoDB知识的人能帮助我理解这种方法的可行性,或者可能会提供任何可能帮助我开始的阅读材料?
我也打开其他build议,人们可能会如何处理这个问题…
我发现embedded式MongoDB库看起来相当有前途,并做你所要求的。
目前支持MongoDB版本: 1.6.5
到3.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的同类包装
如果你使用的是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后的一切。