En un anterior serie de entradas de blog Expliqué cómo usar TestContainers para tus pruebas Junit de Java. Algunos de los temas que no abordamos fueron acerca de cómo probar N1QL, crear tus propios buckets, índice etc... Este post será sobre la construcción de... Spring Data Couchbase casos de prueba y cubrir esas cuestiones que dejamos fuera.

Puerto no configurable por cable

Una de las limitaciones que tenemos actualmente en Couchbase Server es que no se puede cambiar algunos de los puertos por defecto. Esto es un problema con Docker ya que es cambiar los puertos sólo se notifica lo contrario. Esto puede ser genial porque significa que puedes tener varias instancias de Couchbase corriendo en la misma máquina. Pero desafortunadamente no funcionará así que algunos puertos tendrán que ser arreglados. Esto puede ser declarado bastante fácilmente con TestContainers usando el método addFixedExposedPort.

Con eso fuera del camino, nuestro Java SDK será capaz de conectarse a N1QL.

Caso de prueba abstracto de Spring Data Couchbase Docker

El objetivo aquí es crear un caso de prueba abstracto que será utilizado por cualquier clase que necesite una instancia de Couchbase y Spring Data Couchbase configurado. Se empieza como en los posts anteriores instanciando un campo CouchbaseContainer. Como estamos probando Spring Data configuramos el soporte para Index, Query y añadimos FTS para más adelante.

Para asegurarse de que esta clase ejecutará las pruebas de su aplicación, añada el parámetro @RunWith(SpringRunner.class) anotación. Y para asegurarte de que la configuración de tu aplicación se prueba tan bien como nuestra configuración personalizada, añade @SpringBootTest(classes = {GittalentBackendApplication.class, AbstractSPDataTestConfig.CouchbaseTestConfig.class}).

Ahora hablando de configuración personalizada, ¿qué necesitamos? Queremos anular la configuración por defecto de Couchbase de la aplicación. Para ello necesitamos implementar un CouchbaseConfigurer. Esta interfaz define todos los bean necesarios para que Spring Data Couchbase funcione correctamente. Proporciona instancias para CouchbaseEnvironment, ClusterInfo, Cluster y Bucket.

Todos ellos provendrán de nuestra configuración de CouchbaseContainer antes de ejecutar las pruebas. Así que tenemos que asegurarnos de que el Contenedor está funcionando y listo antes de inicializar todos los beans. Esto se puede conseguir añadiendo un método init() anotado con @PostConstruct. Esto nos permitirá primero asegurarnos de que el contenedor se está ejecutando, y luego configurar cosas adicionales. En el siguiente ejemplo configuramos un cubo llamado default y configuramos el tipo de índice para que sea MOI.

Una vez que tenemos este caso de prueba abstracto, todo lo que tenemos que hacer es crear una clase que lo extienda y empezar a escribir pruebas. Aquí podemos inyectar Servicios de nuestra aplicación así como un Bucket de nivel inferior. Lo que ves en este test es primero una llamada a un servicio importador que crea documentos. Luego creamos un índice en el bucket por defecto y probamos una consulta en él.

Como se puede ver una vez creado el caso de prueba Abstracto, la cantidad de código es realmente mínima y corresponde exactamente a lo que se quiere probar.

Autor

Publicado por Laurent Doguin

Laurent es un metalero empollón que vive en París. Principalmente escribe código en Java y texto estructurado en AsciiDoc, y a menudo habla sobre datos, programación reactiva y otras cosas de moda. También fue Developer Advocate de Clever Cloud y Nuxeo, donde dedicó su tiempo y experiencia a ayudar a esas comunidades a crecer y fortalecerse. Ahora dirige las relaciones con los desarrolladores en Couchbase.

2 Comentarios

  1. [...] Laurent Doguin, defensor de los desarrolladores de Couchbase, ha elaborado un buen artículo sobre cómo probar aplicaciones Couchbase de Spring Data con contenedores de prueba y [...]

  2. dreaser dreaser agosto 25, 2018 a 8:34 pm

    Hola,

    Estoy teniendo problemas al hacer varios archivos que extienden la clase Abstract.

    ¿Puedes probar en tu lado? A ver si hay algo que estoy haciendo mal...

    Gracias de antemano,

    Saludos,

Dejar una respuesta