
Recientemente he realizado un desarrollo que lee datos de un MongoDB y que luego los procesa con Spark tras parsear un Xml interno que tiene.
El problema vino a la hora de intentar realizar los tests de cobertura del mismo, ya que Jenkins no me permitía descargar alguna de las librerías que existen para utilizar un MongoDb embebido, así que tuve que probar varias hasta que dí con una que no necesitaba realizar ninguna descarga adicional.
Incluyo aquí la URL de acceso al repositorio del señor que tan amablemente se ha currado estas librerías y que merece todo mi reconocimiento por la sencillez de uso que ha implementado…
https://github.com/bwaldvogel/mongo-java-server
Para ello, hay que seguir los siguientes pasos:
Incluir las siguientes dependencias en el fichero pom.xml
<dependency>
<groupId>de.bwaldvogel</groupId>
<artifactId>mongo-java-server</artifactId>
<version>1.24.0</version>
</dependency>
<dependency>
<groupId>de.bwaldvogel</groupId>
<artifactId>mongo-java-server-core</artifactId>
<version>1.24.0</version>
</dependency>
<dependency>
<groupId>de.bwaldvogel</groupId>
<artifactId>mongo-java-server-memory-backend</artifactId>
<version>1.24.0</version>
</dependency>
Creamos el test Java.
Incluimos los import….
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import org.apache.spark.sql.SparkSession;
import org.bson.Document;
import de.bwaldvogel.mongo.MongoServer;
import de.bwaldvogel.mongo.backend.memory.MemoryBackend;
import com.mongodb.client.MongoCollection;
import de.bwaldvogel.mongo.backend.memory.MemoryBackend
Luego el propio test…
private MongoCollection<Document> collection;
private MongoClient client;
private MongoServer server;
@Test
final void testExecuteProcess() throws IOException {
server = new MongoServer(new MemoryBackend());
// optionally: server.enableSsl(key, keyPassword, certificate);
// bind on a random local port
InetSocketAddress serverAddress = server.bind();
spark = SparkSession.builder()
.master("local")// only for debug
.appName("TESTS_mongo-db-motor")
.config("spark.mongodb.input.uri", "mongodb://"+
serverAddress.getHostName() + // nombre del host == localhost
":"+serverAddress.getPort()+
"/test") // el /test sólo es necesario si hay autenticación de usuarios
.config("spark.mongodb.input.database", "test") // nombre de la base de datos == test
.config("spark.mongodb.input.collection", "test_collection") // nombre de la collection == test_collection
.getOrCreate();
client = new MongoClient(new ServerAddress(serverAddress));
collection = client.getDatabase("test").getCollection(" test_collection ");
// el fichero test.json es un fichero recuperado del Mongo original
URL url = Resources.getResource("test.json");
String text = Resources.toString(url, StandardCharsets.UTF_8);
// lo parseamos
Document doc = Document.parse(text);
// y lo incluimos en la collection
collection.insertOne(doc);
MyClass.executeProcess(spark, "21-01-2020");
client.close();
server.shutdown();
En este ejemplo el número de puerto es aleatorio y el nombre del host será localhost al ejecutarse localmente.