[java] 통합 테스트 실행시 포함 된 MongoDB

내 질문의 변형 이 일 .

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-teststop목표 (예 :)를 제공 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 (일반 가용성)의 일부입니다. 일부 메타 데이터 및 진단 데이터를 제외하고 메모리 내 스토리지 엔진은 구성 데이터, 인덱스, 사용자 자격 증명 등을 포함한 디스크 데이터를 유지하지 않습니다.