sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Cómo hacer que las pruebas de junit usen el mongoDB integrado en una aplicación springboot?

Una alternativa sería ejecutar toda la aplicación Spring Boot en prueba. En este caso, su aplicación Spring Boot se descubrirá automáticamente y Spring Boot descargará e iniciará MongoDB incrustado

@RunWith(SpringRunner.class)
@SpringBootTest
public class YourSpringBootApplicationTests {

08:12:14.676 INFO EmbeddedMongo:42 - nota:noprealloc puede perjudicar el rendimiento en muchas aplicaciones 08:12:14.694 INFO EmbeddedMongo:42 -2017-12-31T08:12:14.693+0200 I CONTROL [initandlisten] MongoDBstarting:pid=2246 port =52299 08:12:22.005 INFO conexión:71 -Conexión abierta [connectionId{localValue:2, serverValue:2}] tolocalhost:52299

En el caso de su ejemplo, puede modificar el código para iniciar Mongo incrustado en un puerto diferente:

  1. agregue el archivo test/resources/test.properties para anular las propiedades de application.properties

    mongo.db.name=person_testDB
    mongo.db.url=localhost
    mongo.db.port=12345
    
  2. modificar MongoDBConfig:añadir campo MONGO_DB_PORT

    @EnableMongoRepositories
    public class MongoDBConfig {
        @Value("${mongo.db.url}")
        private String MONGO_DB_URL;
    
        @Value(("${mongo.db.port:27017}"))
        private int MONGO_DB_PORT;
    
        @Value("${mongo.db.name}")
        private String MONGO_DB_NAME;
    
        @Bean
        public MongoTemplate mongoTemplate() {
            MongoClient mongoClient = new MongoClient(MONGO_DB_URL, MONGO_DB_PORT);
            MongoTemplate mongoTemplate = new MongoTemplate(mongoClient, MONGO_DB_NAME);
            return mongoTemplate;
        }
    }
    
  3. modificar la clase de prueba:eliminar la anotación @DataMongoTest. Esta anotación fuerza el inicio de la instancia mongoDB incrustada

    static MongodExecutable mongodExecutable;
    
    @BeforeClass
    public static void setup() 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();
        mongodExecutable = null;
        try {
            mongodExecutable = starter.prepare(mongodConfig);
            mongodExecutable.start();
        } catch (Exception e){
            // log exception here
            if (mongodExecutable != null)
                mongodExecutable.stop();
        }
    }
    
    @AfterClass
    public static void teardown() throws Exception {
        if (mongodExecutable != null)
            mongodExecutable.stop();
    }
    

Una forma más es usar MongoRepository e init Embedded Mongo como parte de la clase @Configuration de prueba:se describe aquí:¿Cómo se configura Embedded MongDB para pruebas de integración en una aplicación Spring Boot?