import org.springframework.data.redis.core.StringRedisTemplate
@SpringBootTest
class RedisRepositoryImplTest {
@Autowired
private lateinit var redisTemplate: StringRedisTemplate
@BeforeEach
fun setUp() {
redisFlushAll()
}
@AfterEach
fun tearDown() {
redisFlushAll()
}
private fun redisFlushAll() {
redisTemplate.connectionFactory?.connection?.serverCommands()?.flushAll()
}
}
<aside> ❗
FLUSHALL은 Redis의 모든 DB를 초기화하기 때문에, 다른 테스트나 서비스에 영향을 줄 수 있습니다.
그렇기 때문에 테스트 전용 Redis 인스턴스를 사용하는 것이 좋습니다.
</aside>
<aside> ❗
테스트내에서 @Transactional 을 사용해도 redis 에 저장되는 데이터들은 기본적으로 롤백되지 않습니다.
즉, 테스트에서 저장한 데이터가 다른 테스트에 영향을 줄 수 있는 환경입니다. (멱등성 지켜지지 않음.)
그렇기 때문에 전/후에 초기화를 꼭해야 다른 테스트에 영향이 없습니다.
</aside>
private fun flushRedis() {
redisTemplate.connectionFactory?.connection?.flushAll()
}
블로그를 찾아보면 DefaultedRedisConnection의 flushAll()을 사용하는 케이스가 많습니다.
하지만 DefaultedRedisConnection에서 제공하는 메서드는 전부 deprecated 됐습니다.
사실 내부적으로 동작은 위에서 작성한 코드와 동일합니다.
/** @deprecated in favor of {@link RedisConnection#serverCommands()}. */
@Override
@Deprecated
default void flushAll(FlushOption option) {
serverCommands().flushAll(option);
}