Unit test Redis Template executePipelined() for multi save with timeout

Viewed 475

This is my function that uses StringLong Redis Template, and stores multi values to Redis with a timeout. I am facing a problem verifying the save operation for each key.

private final RedisTemplate<String, Long> redis;
public void store(
        List<String> keys,
        List<Long> values,
        long timeToLiveInSec
    ) {
        RedisCallback<Object> action = connection -> {
            Streams.forEachPair(
                keys.stream(),
                values.stream(),
                (key, value) -> redis.opsForValue().set(key, value, timeToLiveInSec, TimeUnit.SECONDS);
            );
            return null;
        };
        redis.executePipelined(action);
  }

I have this in my test

private RedisTemplate<String, Long> redis = mock(RedisTemplate.class);

private ValueOperations<String, Long> redisOps = mock(ValueOperations.class);

private final CacheRepository repository = new CacheRepository(redis);    

@Test
void when_storeInCacheWithTimeout_then_verify() {
    // Given
    List<String> estimationKeys = asList(CACHE_KEY_1, CACHE_KEY_2);
    List<Long> estimations = asList(10L, 20L);

    // When
    when(redis.opsForValue()).thenReturn(redisOps);

    // Test
    repository.storeEstimations(estimationKeys, estimations, 30);

    // Then
    verify(redis).executePipelined(any(RedisCallback.class));
}
0 Answers
Related