Ya hemos probado otras veces el Testcontainers, aquí. Hoy veremos un ejemplo más de cómo usarlo, esta vez con MongoDB. Veremos dos ejemplos, uno más básico y otro configurando autenticación.
Sabemos que una de las cosas más interesantes de Testcontainers es la posibilidad de completar tus pruebas unitarias y emular un entorno de integración. Facilitando nuestro desarrollo y minimizando posibles errores en el ciclo de vida de la aplicación.
En este primer ejemplo, simplemente crearemos una instancia de MongoDB sin ningún tipo de configuración. Lo podremos hacer con ayuda de la clase MongoDBContainer a la que solo deberemos indicar que versión de MongoDB queremos usar. Si queremos saber la cadena de conexión la podremos obtener de la propia instancia de MongoDBContainer a través del método 'getConnectionString'
Para la prueba de concepto hemos usado el propio cliente de Mongo que nos permita leer y escribir en la base de datos.
@Log4j2 public class TestContainerMongoDBTest { static final String DBNAME = "myDatabase"; static String URI; static MongoDBContainer mongoDBContainer; @BeforeClass public static void startMongoDB() { mongoDBContainer = new MongoDBContainer(DockerImageName.parse("mongo:7.0.14")); mongoDBContainer.start(); URI = mongoDBContainer.getConnectionString() + "/" + DBNAME; } @Test public void insertAndCount() { try(MongoClient mongoClient = MongoClients.create(URI)){ MongoDatabase database = mongoClient.getDatabase(DBNAME); MongoCollection<Document> collection = database.getCollection("testCollection"); Document doc1 = new Document("title", "Inception").append("imdb", new Document("rating", 8.8)); collection.insertOne(doc1); assertThat(collection.countDocuments(), equalTo(1L)); } } }
Como hemos visto, en un par de lineas podemos tener una MongoDB lista para realizar nuestras pruebas. Pero puede que necesitemos añadir más configuración a la creación de la instancia de MongoDB. En ese caso, es mejor utilizar la clase GenericContainer de Testcontainers. La cual nos permite un mayor grado de configuración. Por ejemplo en este caso, indicaremos que puerto expondremos, cual será el usuario y la contraseña a utilizar, incluso el nombre del esquema a usar de la base de datos.
Por lo demás el ejemplo será igual al anterior y por tanto lo podremos volver a probar con el cliente de MongoDB.
public class MongoDBCustomTest { static final String DBNAME = "myDatabase"; static final String USER = "mongoadministrator"; static final String PASS = "secret"; static final int MONGO_PORT = 27017; static GenericContainer mongoDBContainer;
static String URI;public static void startMongoDB() { mongoDBContainer = new GenericContainer(DockerImageName.parse("mongo:7.0.14")); List<String> list = new ArrayList<>(); list.add("MONGO_INITDB_ROOT_USERNAME="+USER); list.add("MONGO_INITDB_ROOT_PASSWORD="+PASS); list.add("MONGO_INITDB_DATABASE="+DBNAME); mongoDBContainer.setEnv(list); mongoDBContainer.withExposedPorts(MONGO_PORT); mongoDBContainer.start(); URI = String.format("mongodb://%s:%s@%s:%d/%s?authSource=admin",@BeforeClass
USER, PASS, mongoDBContainer.getHost(),
mongoDBContainer.getFirstMappedPort(), DBNAME); } @Test public void insertAndCount() { try (MongoClient mongoClient = MongoClients.create( new ConnectionString(URI))) { MongoDatabase database = mongoClient.getDatabase(DBNAME); MongoCollection<Document> collection = database.getCollection("testCollection"); Document doc1 = new Document("title", "Inception").append("imdb", new Document("rating", 8.8)); collection.insertOne(doc1); assertThat(collection.countDocuments(), equalTo(1L)); } } }
Como siempre, espero que os haya servido de ayuda y aquí puedes ver todo el código.
No hay comentarios:
Publicar un comentario