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