복붙노트

[MONGODB] 통합 테스트를 실행할 때 MongoDB를 임베디드

MONGODB

통합 테스트를 실행할 때 MongoDB를 임베디드

제 질문은 이것의 변형입니다.

내 자바 웹 응용 프로그램 프로젝트 GridFS 같은 도구를 읽어 필터 / 쿼리 및 인터페이스를 많이 필요로하기 때문에, 나는 위의 솔루션을 제안하는 방식으로 채용하여 MongoDB에 합리적인 방법을 생각 사투를 벌인거야.

따라서, 내 통합 테스트와 함께 MongoDB를의 임베디드 인스턴스를 실행 고려 중이 야. 나는 (중 각 테스트 또는 전체 제품군에 대한) 모든 테스트에 대한 데이터베이스를 플러시 자동으로 시작하고, 마지막에 종료하고 싶습니다. 내 솔루션은 또한 휴대 할 필요가있을 것이다, 그래서이 테스트는, 개발 기계뿐만 아니라 CI 서버에서 실행 될 수 있습니다.

MongoDB의 도움 나이 방법의 타당성의 아이디어를 얻을, 그리고 / 혹은 어떤 독서 자료를 제시에 대한 자세한 지식을 캔 사람은 나를 시작하는 데 도움이 수 있습니까?

나는 또한 사람들이 내가이 문제를 접근 할 수있는 방법에 미칠 수있는 다른 제안을 열려있어 ...

해결법

  1. ==============================

    1.여기 @rozky에서 허용 대답의 업데이트 (2019) 버전 (많은이 몽고 및 임베디드 MongoDB를 라이브러리에 모두 변경되었습니다)가 있습니다.

    여기 @rozky에서 허용 대답의 업데이트 (2019) 버전 (많은이 몽고 및 임베디드 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());
        }
    
    }
    
  2. ==============================

    2.나는 매우 유망 보이는 당신이 요구 한 것을 수행 임베디드 MongoDB의 라이브러리를 발견했다.

    나는 매우 유망 보이는 당신이 요구 한 것을 수행 임베디드 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));
        }
    }
    
  3. ==============================

    3.포 스퀘어 제품 Fongo이있다. Fongo는 몽고의 메모리 자바 구현이다. 그것은 발견, 업데이트, 삽입, 제거하고 다른 방법에 대한 표준 몽고 - 자바 드라이버에 대한 호출을 차단합니다. 주요 사용은 당신이 몽고 과정을 회전하지 않으려는 경량의 단위 테스트를위한 것입니다.

    포 스퀘어 제품 Fongo이있다. Fongo는 몽고의 메모리 자바 구현이다. 그것은 발견, 업데이트, 삽입, 제거하고 다른 방법에 대한 표준 몽고 - 자바 드라이버에 대한 호출을 차단합니다. 주요 사용은 당신이 몽고 과정을 회전하지 않으려는 경량의 단위 테스트를위한 것입니다.

  4. ==============================

    4.당신은 메이븐을 사용하는 경우 당신은 내가 그 래핑 flapdoodle.de '임베디드 몽고'API를 만든 플러그인에 관심이있을 수 :

    당신은 메이븐을 사용하는 경우 당신은 내가 그 래핑 flapdoodle.de '임베디드 몽고'API를 만든 플러그인에 관심이있을 수 :

    그것은 당신이 (예를 들어, 사전 통합 테스트 동안) 당신이 원하는 MongoDB의 모든 버전을 시작하는 데 사용할 수있는 시작 목표, 그리고 (예를 들어, 후 통합 테스트 중) MongoDB를 중지하는 정지 목표를 제공합니다.

    다른 사람을 통해이 플러그인을 사용하는 진정한 장점은 MongoDB를 미리 설치할 수에 대한 요구 사항이 없다는 것입니다. MongoDB를 바이너리 다운로드 ~이 / .embedmongo에 대한 미래의 빌드에 저장됩니다.

  5. ==============================

    5.당신은 SBT와 specs2를 사용하는 경우, 나는 embedmongo에 대한 래퍼의 같은 종류를 썼다

    당신은 SBT와 specs2를 사용하는 경우, 나는 embedmongo에 대한 래퍼의 같은 종류를 썼다

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

  6. ==============================

    6.봄 부팅 1.3 당신은 EmbeddedMongoAutoConfiguration을 사용할 수 있습니다

    봄 부팅 1.3 당신은 EmbeddedMongoAutoConfiguration을 사용할 수 있습니다

    pom.hml

    <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{
    }
    
  7. ==============================

    7.당신은 버전 3.2.6 기준으로 메모리에 MongoDB를 실행할 수 있습니다. 사이트에서 :

    당신은 버전 3.2.6 기준으로 메모리에 MongoDB를 실행할 수 있습니다. 사이트에서 :

  8. ==============================

    8.당신이 받는다는을 사용하는 경우, 당신은 우리에게 http://mvnrepository.com/artifact/com.wenzani/mongodb-maven-plugin을 사용할 수 있습니다

    당신이 받는다는을 사용하는 경우, 당신은 우리에게 http://mvnrepository.com/artifact/com.wenzani/mongodb-maven-plugin을 사용할 수 있습니다

  9. ==============================

    9.또한 MongoDB를 JVM 내부 메모리를 시뮬레이션이 프로젝트를 확인할 수 있습니다. https://github.com/thiloplanz/jmockmongo 그러나 아직 개발이다.

    또한 MongoDB를 JVM 내부 메모리를 시뮬레이션이 프로젝트를 확인할 수 있습니다. https://github.com/thiloplanz/jmockmongo 그러나 아직 개발이다.

  10. ==============================

    10.아니 단위 testings를 [단지에 대한,하지만 당신은 당신이 리눅스를 사용하는 경우 메모리 배포로 MongoDB를 (심지어 클러스터)를 실행하고자하는 경우이 블로그 게시물을 읽어 보시기 바랍니다.

    아니 단위 testings를 [단지에 대한,하지만 당신은 당신이 리눅스를 사용하는 경우 메모리 배포로 MongoDB를 (심지어 클러스터)를 실행하고자하는 경우이 블로그 게시물을 읽어 보시기 바랍니다.

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

    하지만 RavenDB 같은 상자의 그것을 밖으로 가지고 좋은 것입니다.

  11. ==============================

    11.여기에 언급 된 embedmongo - 받는다는 - 플러그인과 유사하는 Gradle을 몽고 플러그인을 사용할 수도있다.

    여기에 언급 된 embedmongo - 받는다는 - 플러그인과 유사하는 Gradle을 몽고 플러그인을 사용할 수도있다.

    메이븐처럼 그것은 또한 터무니없는 말 EmbeddedMongoDb API를 래핑하고 당신이 당신의 Gradle을 빌드에서 몽고의 관리되는 인스턴스를 실행할 수 있습니다 플러그인.

  12. ==============================

    12.여기에이 코드 예제를 확인하십시오 https://github.com/familysyan/embedded-mongo-integ합니다. 아니 설치, 아니 의존성. 그것은 단순히 당신을 위해 다운로드 및 설치를 할 수있는 플랫폼 독립적 인 개미 스크립트입니다. 그것은 또한 당신의 테스트 후 모든 것을 정리합니다.

    여기에이 코드 예제를 확인하십시오 https://github.com/familysyan/embedded-mongo-integ합니다. 아니 설치, 아니 의존성. 그것은 단순히 당신을 위해 다운로드 및 설치를 할 수있는 플랫폼 독립적 인 개미 스크립트입니다. 그것은 또한 당신의 테스트 후 모든 것을 정리합니다.

  13. ==============================

    13.생산, 당신은 실제 데이터베이스를 사용하는 것입니다.

    생산, 당신은 실제 데이터베이스를 사용하는 것입니다.

    당신이 당신의 테스트 제품 생산 동작하는 방법을 반영 할 경우, 몽고의 실제 인스턴스를 사용합니다.

    가짜 구현은 진짜와 똑같은 동작하지 않을 수 있습니다. 테스트 할 때, 당신은 정확성을 위해 노력한다. 실행 속도가 두 번째 온다.

  14. from https://stackoverflow.com/questions/6437226/embedded-mongodb-when-running-integration-tests by cc-by-sa and MIT license