Embedded MongoDB cuando se ejecutan pruebas de integración

Mi pregunta es una variación de este .

Como mi proyecto de aplicación web Java requiere una gran cantidad de filtros de lectura / consultas e interfaces con herramientas como GridFS, me cuesta pensar en una forma sensata de emplear MongoDB de la manera que sugiere la solución anterior.

Por lo tanto, estoy considerando ejecutar una instancia integrada de MongoDB junto con mis pruebas de integración. Me gustaría que se inicie automáticamente (ya sea para cada prueba o para todo el conjunto), purgue la base de datos para cada prueba y cierre al final. Estas pruebas se pueden ejecutar en máquinas de desarrollo, así como en el servidor de CI, por lo que mi solución también deberá ser portátil .

¿Puede alguien con más conocimiento sobre MongoDB ayudarme a tener una idea de la viabilidad de este enfoque, y / o quizás sugerir algún material de lectura que pueda ayudarme a comenzar?

También estoy abierto a otras sugerencias que la gente pueda tener sobre cómo podría abordar este problema …

Encontré la biblioteca Embedded MongoDB que parece bastante prometedora y hace lo que usted ha pedido.

Actualmente es compatible con las versiones de MongoDB: 1.6.5 a 3.1.6 , siempre que los binarios todavía estén disponibles desde el espejo configurado.

Aquí hay un breve ejemplo de uso, que acabo de probar y funciona perfectamente:

 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)); } } 

Hay un producto Foursquare de Fongo . Fongo es una implementación java en memoria de mongo. Se intercepta las llamadas al controlador mongo-java estándar para encontrar, actualizar, insertar, eliminar y otros métodos. El uso principal es para pruebas de unidades livianas en las que no se desea girar un proceso de mongo.

Si está utilizando sbt y specs2, escribí el mismo tipo de contenedor para embedmongo

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

Si está usando Maven, puede que le interese un plugin que he creado que envuelve la API de flapdoodle.de ‘mongo incrustado’ :

embedmongo-maven-plugin

Proporciona un objective de start que puede utilizar para iniciar cualquier versión de MongoDB que desee (por ejemplo, durante pre-integration-test ) y un objective de stop que detendrá a MongoDB (por ejemplo, durante post-integration-test ).

El beneficio real de usar este complemento sobre otros es que no hay ningún requisito para que MongoDB se instale de antemano. Los archivos binarios de MongoDB se descargan y almacenan en ~/.embedmongo para futuras comstackciones.

con spring-boot 1.3 puede usar EmbeddedMongoAutoConfiguration

pom.xml

  org.springframework.boot spring-boot-starter-parent 1.3.2.RELEASE  ...  org.springframework.boot spring-boot-starter-data-mongodb   de.flapdoodle.embed de.flapdoodle.embed.mongo ${embedded-mongo.version}  

MongoConfig

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

Puede ejecutar MongoDB en la memoria a partir de la versión 3.2.6. Desde el sitio :

A partir de MongoDB Enterprise versión 3.2.6, el motor de almacenamiento en memoria forma parte de la disponibilidad general (GA) en las comstackciones de 64 bits. Aparte de algunos metadatos y datos de diagnóstico, el motor de almacenamiento en memoria no mantiene ningún dato en el disco, incluidos datos de configuración, índices, credenciales de usuario, etc.

Si está usando maven, puede usar nuestro http://mvnrepository.com/artifact/com.wenzani/mongodb-maven-plugin

También puede verificar este proyecto que simula un MongoDB dentro de la memoria JVM. https://github.com/thiloplanz/jmockmongo Pero todavía está en desarrollo.

No [solo para] pruebas de unidades, pero lea esta publicación de blog si desea ejecutar MongoDB (incluso un clúster) como implementación en memoria si está utilizando Linux.

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

Sería genial tenerlo fuera de la caja como RavenDB sin embargo.

Similar al embedmongo-maven-plugin mencionado aquí, también hay un Pluder Mongo Plugin disponible.

Al igual que el plugin Maven, también incluye la aplicación flapdoodle EmbeddedMongoDb y le permite ejecutar una instancia administrada de Mongo desde sus comstackciones de Gradle.

En producción, utilizará una base de datos real.

Si desea que sus pruebas reflejen cómo se comporta su producto en la producción, use una instancia real de Mongo.

Una implementación falsa puede no comportarse exactamente igual a una real. Al realizar pruebas, debe esforzarse por ser correctos. La velocidad de ejecución viene en segundo lugar.

Verifique este ejemplo de código aquí: https://github.com/familysyan/embedded-mongo-integ . Sin instalación, sin dependencia. Es simplemente un guión de ant independiente de la plataforma que se descarga y configura por usted. También limpia todo después de tus pruebas.

    Intereting Posts