example - mongodb java ejemplo
Embedded MongoDB cuando se ejecutan pruebas de integraciĆ³n (12)
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 ...
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.
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.
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.
Puede ejecutar MongoDB en la memoria a partir de la versión 3.2.6. Desde el site :
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 compilaciones 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 que le interese un plugin que he creado que envuelve la API de flapdoodle.de ''mongo incrustado'' :
embedmongo-maven-plugin
Proporciona un objetivo de start
que puede utilizar para iniciar cualquier versión de MongoDB que desee (por ejemplo, durante pre-integration-test
) y un objetivo 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 compilaciones.
Si está usando maven, puede usar nuestro http://mvnrepository.com/artifact/com.wenzani/mongodb-maven-plugin
Si está utilizando sbt y specs2, escribí el mismo tipo de contenedor para embedmongo
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 compilaciones de Gradle.
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.
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 hormiga independiente de la plataforma que se descarga y configura por usted. También limpia todo después de tus pruebas.
con spring-boot 1.3 puede usar 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{
}