embedded mongodb

wgmfuz8q  于 2021-07-12  发布在  Java
关注(0)|答案(10)|浏览(377)

我的问题是这个问题的一个变体。
由于我的javawebapp项目需要大量的读取过滤器/查询以及与gridfs等工具的接口,因此我很难想出一种明智的方法来按照上述解决方案的建议使用mongodb。
因此,我正在考虑在集成测试的同时运行mongodb的嵌入式示例。我希望它自动启动(无论是对于每个测试还是整个套件),为每个测试刷新数据库,并在最后关闭。这些测试可能在开发机器和ci服务器上运行,因此我的解决方案也需要可移植性。
任何对mongodb有更多了解的人能帮助我了解这种方法的可行性吗,或者建议一些可以帮助我入门的阅读材料?
我也愿意接受别人对我如何解决这个问题的建议。。。

mefy6pfw

mefy6pfw1#

以下是@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());
    }

}
lyr7nygr

lyr7nygr2#

我找到了嵌入式mongodb库,它看起来很有前途,可以满足您的要求。
目前支持mongodb版本: 1.6.53.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));
    }
}
iyfamqjs

iyfamqjs3#

有foursquare产品fongo。fongo是mongo的内存java实现。它拦截对标准mongojava驱动程序的查找、更新、插入、删除和其他方法的调用。主要用途是轻量级单元测试,您不想让mongo进程加速。

sg24os4d

sg24os4d4#

如果您使用的是maven,您可能会对我创建的一个插件感兴趣,该插件封装了flapdoodle.de“embedded mongo”api:

embedmongo maven插件

它提供了一个 start 您可以用来启动任何版本的mongodb的目标(例如 pre-integration-test ),和 stop 停止mongodb的目标(例如 post-integration-test ).
与其他插件相比,使用此插件的真正好处是不需要事先安装mongodb。mongodb二进制文件下载并存储在 ~/.embedmongo 用于将来的构建。

34gzjxbg

34gzjxbg5#

如果您使用的是sbt和specs2,那么我为embedmongo编写了相同的 Package 器
https://github.com/athieriot/specs2-embedmongo

okxuctiv

okxuctiv6#

使用SpringBoot1.3,您可以使用EmbeddedMongoutoConfiguration
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>

蒙哥哥菲格

@Configuration
@EnableAutoConfiguration(exclude = { EmbeddedMongoAutoConfiguration.class })
public class MongoConfig{
}
sxpgvts3

sxpgvts37#

从3.2.6版开始,您可以在内存中运行mongodb。从现场:
从mongodb企业版3.2.6开始,内存中的存储引擎是64位版本中的通用可用性(ga)的一部分。除了一些元数据和诊断数据外,内存存储引擎不维护任何磁盘数据,包括配置数据、索引、用户凭据等。

qoefvg9y

qoefvg9y8#

不仅针对单元测试,还解释了如何将inmemory mongodb与restapi结合使用。

maven依赖关系:

<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>
        </dependency>

=============================================================================

应用程序属性

server.port = 8080
spring.data.mongodb.database=user_db
spring.data.mongodb.port=27017
spring.data.mongodb.host=localhost

=============================================================================

用户存储库.java

公共接口userrepository扩展了mongorepository{

}

供参考和所有java代码使用以下链接:(分步说明)
https://www.youtube.com/watch?v=2tq2q7ezhsa&t=7s

zpjtge22

zpjtge229#

执行时性能更好 mongodstorageEngine='ephemeralForTest' ```
new MongodConfigBuilder()
.version(Version.Main.PRODUCTION)
.cmdOptions(new MongoCmdOptionsBuilder()
.useStorageEngine("ephemeralForTest")
.build())
.net(new Net("localhost", port, Network.localhostIsIPv6()))
.build()

v8wbuo2f

v8wbuo2f10#

在生产中,您将使用一个真正的数据库。
如果您希望您的测试反映产品在生产中的行为,请使用mongo的真实示例。
假实现的行为可能与真实实现的行为不完全相同。在测试时,你应该争取正确性。执行速度位居第二。

相关问题