내 질문의 변형 이 일 .
Java Web-app 프로젝트에는 많은 읽기 필터 / 쿼리 및 GridFS와 같은 도구와의 인터페이스가 필요하기 때문에 위의 솔루션이 제안하는 방식으로 MongoDB를 사용하는 합리적인 방법을 생각하는 데 어려움을 겪고 있습니다.
따라서 통합 테스트와 함께 MongoDB의 임베디드 인스턴스를 실행하는 것을 고려하고 있습니다. 자동으로 시작하고 (각 테스트 또는 전체 제품군에 대해) 모든 테스트에 대해 데이터베이스 를 비우고 마지막에 종료 하고 싶습니다 . 이러한 테스트는 개발 머신과 CI 서버에서 실행될 수 있으므로 내 솔루션도 이식 가능 해야합니다. .
MongoDB에 대해 더 많은 지식을 가진 사람이이 접근 방식의 타당성에 대한 아이디어를 얻도록 도와 줄 수 있고 / 또는 시작하는 데 도움이 될만한 읽기 자료를 제안 할 수 있습니까?
나는 또한 사람들이이 문제에 어떻게 접근 할 수 있는지에 대한 다른 제안에 열려 있습니다.
답변
다음 은 @rozky 의 승인 된 답변 의 업데이트 된 (2019 년) 버전입니다 (Mongo 및 Embedded 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());
}
}
답변
나는 발견했다 임베디드 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));
}
}
답변
Foursquare 제품 Fongo가 있습니다. Fongo는 mongo의 메모리 내 Java 구현입니다. 찾기, 업데이트, 삽입, 제거 및 기타 메소드를 위해 표준 mongo-java-driver에 대한 호출을 가로 챕니다. 주요 용도는 몽고 프로세스를 가동하고 싶지 않은 경량 단위 테스트입니다.
답변
Maven을 사용하는 경우 flapdoodle.de ’embedded mongo’API 를 래핑하는 내가 만든 플러그인에 관심이있을 수 있습니다 .
embedmongo-maven-plugin
start
원하는 MongoDB 버전을 시작하는 데 사용할 수 있는 목표 (예 :)와 MongoDB를 중지 pre-integration-test
할 stop
목표 (예 :)를 제공 post-integration-test
합니다.
이 플러그인을 다른 플러그인에 비해 사용하는 실제 이점은 MongoDB를 미리 설치할 필요가 없다는 것입니다. MongoDB 바이너리는 ~/.embedmongo
향후 빌드 를 위해 다운로드되고 저장됩니다 .
답변
sbt 및 specs2를 사용하는 경우 embedmongo에 대해 동일한 종류의 래퍼를 작성했습니다.
https://github.com/athieriot/specs2-embedmongo
답변
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 (일반 가용성)의 일부입니다. 일부 메타 데이터 및 진단 데이터를 제외하고 메모리 내 스토리지 엔진은 구성 데이터, 인덱스, 사용자 자격 증명 등을 포함한 디스크 데이터를 유지하지 않습니다.