Spring Data RedisのテストにTestcontainersを使う

Spring Data RedisのRedisTemplateのテストにTestcontainersを使いたいときのメモ。

ソースコード

build.gradle

plugins {
    id 'org.springframework.boot' version '2.4.5'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = JavaVersion.VERSION_11

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-redis'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation platform('org.testcontainers:testcontainers-bom:1.15.3')
    testImplementation 'org.testcontainers:testcontainers'
    testImplementation 'org.testcontainers:junit-jupiter'
}

test {
    useJUnitPlatform()
}

RedisClient.java

@Component
public class RedisClient {
    private final StringRedisTemplate redisTemplate;

    public RedisClient(StringRedisTemplate redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    public String get(String key) {
        return redisTemplate.opsForValue().get(key);
    }

    public void set(String key, String value) {
        redisTemplate.opsForValue().set(key, value);
    }
}

RedisClientTest.java

@SpringBootTest(webEnvironment = WebEnvironment.NONE)
@Testcontainers
class RedisClientTest {
    @Container
    private static final GenericContainer<?> CONTAINER =
        new GenericContainer<>("redis:6.2").withExposedPorts(6379);
    @Autowired
    private RedisClient client;

    @DynamicPropertySource
    static void redisProperties(DynamicPropertyRegistry registry) {
        registry.add("spring.redis.port", () -> CONTAINER.getMappedPort(6379));
    }

    @BeforeEach
    void setUp() {
        client.set("key1", "value1");
    }

    @Test
    void get() {
        String result = client.get("key1");
        assertNotNull(result);
        assertEquals("value1", result);
    }
}

参考