MongoDB integrado ao executar testes de integração

Minha pergunta é uma variação deste .

Como meu projeto de aplicativo da Web Java requer muitos filtros / consultas de leitura e interfaces com ferramentas como o GridFS, estou com dificuldades para pensar em uma maneira sensata de empregar o MongoDB da maneira sugerida pela solução acima.

Portanto, estou pensando em executar uma instância incorporada do MongoDB juntamente com meus testes de integração. Eu gostaria que ele fosse iniciado automaticamente (para cada teste ou para todo o conjunto), liberasse o banco de dados para cada teste e encerrasse no final. Esses testes podem ser executados em máquinas de desenvolvimento, bem como no servidor de IC, portanto, minha solução também precisará ser portátil .

Alguém que tenha mais conhecimento sobre o MongoDB pode me ajudar a ter ideia da viabilidade dessa abordagem e / ou talvez sugerir algum material de leitura que possa me ajudar a começar?

Eu também estou aberto a outras sugestões que as pessoas possam ter sobre como eu poderia abordar este problema …

Eu encontrei a biblioteca Embedded MongoDB que parece bastante promissora e faz o que você pediu.

Atualmente suporta as versões do MongoDB: 1.6.5 a 3.1.6 , desde que os binários ainda estejam disponíveis a partir do espelho configurado.

Aqui está um pequeno exemplo de uso, que acabei de experimentar e funciona perfeitamente:

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

Existe Fongo produto Foursquare . Fongo é uma implementação java in-memory do mongo. Ele intercepta as chamadas para o mongo-java-driver padrão para encontrar, atualizar, inserir, remover e outros methods. O principal uso é para teste de unidade leve, onde você não quer girar um processo mongo.

Se você está usando sbt e specs2, eu escrevi o mesmo tipo de wrapper para embedmongo

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

Se você está usando o Maven, você pode estar interessado em um plugin que eu criei que envolve a API flapdoodle.de ’embedded mongo’ :

embedmongo-maven-plugin

Ele fornece uma meta de start que você pode usar para iniciar qualquer versão do MongoDB desejada (por exemplo, durante o pre-integration-test ) e uma meta de stop que parará o MongoDB (por exemplo, durante o teste de post-integration-test ).

O benefício real de usar este plugin sobre outros é que não há necessidade de instalar o MongoDB antecipadamente. Os binários do MongoDB são baixados e armazenados em ~/.embedmongo para construções futuras.

com spring-boot 1.3 você pode 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{ } 

Você pode executar o MongoDB na memory a partir da versão 3.2.6. Do site :

A partir do MongoDB Enterprise versão 3.2.6, o mecanismo de armazenamento in-memory faz parte da disponibilidade geral (GA) nas compilações de 64 bits. Além de alguns metadados e dados de diagnóstico, o mecanismo de armazenamento na memory não mantém dados no disco, incluindo dados de configuração, índices, credenciais do usuário etc.

Se você estiver usando maven, você pode usar o nosso http://mvnrepository.com/artifact/com.wenzani/mongodb-maven-plugin

Você também pode verificar este projeto que simula um MongoDB dentro da memory da JVM. https://github.com/thiloplanz/jmockmongo Mas ainda está em desenvolvimento.

Não [apenas para] testes de unidade, mas leia esta postagem do blog se você quiser executar o MongoDB (até mesmo um cluster) como implantação na memory, se estiver usando o Linux.

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

Seria ótimo tê-lo fora da checkbox como RavenDB embora.

Semelhante ao plugin embedmongo-maven mencionado aqui, há também um plugin Gradle Mongo disponível.

Como o plugin Maven, ele também envolve a API EmbeddedMongoDb do flapdoodle e permite que você execute uma instância gerenciada do Mongo a partir das construções do Gradle.

Na produção, você estará usando um database real.

Se você quiser que seus testes reflitam como o seu produto se comporta na produção, use uma instância real do Mongo.

Uma implementação falsa pode não se comportar exatamente da mesma maneira que uma real. Ao testar, você deve se esforçar para corrigir. Velocidade de execução vem em segundo lugar.

Verifique este exemplo de código aqui: https://github.com/familysyan/embedded-mongo-integ . Nenhuma instalação, nenhuma dependência. É simplesmente um script ant independente de plataforma que faz download e configuração para você. Também limpa tudo depois dos seus testes.