Usando Redis en Pruebas [versión 2]

Previamente había comentado como utilizar Redis en pruebas mediante redis embebido, pero en esta ocasión utilizaremos Testcontainers, que como lo dicen en su página, podemos utilizar cualquier cosa que corra en docker en nuestros tests 😮.

Comencemos

Lo primero es incluir en nuestro pom la dependencia a testcontainers:

<dependency>
    <groupId>org.testcontainers</groupId>
    <artifactId>testcontainers</artifactId>
    <version>1.11.2</version>
</dependency>

También incluimos otras librerías de test y el cliente redis:
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.assertj</groupId>
    <artifactId>assertj-core</artifactId>
    <version>3.11.1</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.1.0-m1</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-simple</artifactId>
    <version>1.7.26</version>
    <scope>test</scope>
</dependency>

Ahora en nuestra clase de test escribimos lo siguiente:
@Rule
public GenericContainer redis = new GenericContainer<>("redis:5.0.3-alpine").withExposedPorts(6379);

@Test
public void clientePuedeObtenerConexion() {
    var cliente = new Jedis(redis.getContainerIpAddress(), redis.getFirstMappedPort());
    cliente.set("hola", "chao");
    Assertions.assertThat(cliente.get("hola")).isEqualTo("chao");
}

Lo que hace es iniciar la imagen redis:5.0.3-alpine en un contenedor y define el puerto interno PERO lo expone en el primer puerto que encuentra. Para cambiar este comportamiento hacemos lo siguiente exponiendo el puerto local 10000:


final Consumer config = e -> 
e.withPortBindings(new PortBinding(Ports.Binding.bindPort(10000),
new ExposedPort(containerExposedPort)));

@Rule
public GenericContainer redis = new GenericContainer("redis:5.0.3-alpine")
                .withExposedPorts(containerExposedPort)
                .withCreateContainerCmdModifier(config);


nuestro cliente puede ahora conectarse al puerto 10.000.

El código completo está disponible en Github 😃.




No hay comentarios.:

Publicar un comentario