AllInMarketApplicationTests (@SpringBootTest)
→ Spring Data Redis 자동 설정 → RedisKeyValueAdapter 생성
→ afterPropertiesSet() → initMessageListenerContainer()
→ RedisMessageListenerContainer.setConnectionFactory(null) ← 여기서 폭발
핵심 원인: TestRedisConfig에서 RedisTemplate을 완전한 Mockito mock으로 등록

Spring Data Redis가 컨텍스트를 초기화할 때, RedisKeyValueAdapter가 내부적으로 RedisMessageListenerContainer를 설정하기 위해 다음을 호출
// RedisKeyValueAdapter 내부 (initMessageListenerContainer)
container.setConnectionFactory(redisOps.getConnectionFactory());
Mockito mock은 기본적으로 객체 반환 메서드에 대해 null을 반환합니다. 따라서 redisTemplate.getConnectionFactory()가 null을 반환하고 RedisMessageListenerContainer.setConnectionFactory(null)이 IllegalArgumentException을 던집니다.
TestRedisConfig에 RedisConnectionFactory mock이 있어도, RedisKeyValueAdapter는 RedisConnectionFactory 빈을 직접 주입받는 것이 아니라 RedisTemplate.getConnectionFactory()를 호출해서 가져오기 때문에, 분리된 mock에서는 연결이 끊어집니다.
방법 1 (권장): application-test.yml에 Redis 레포지토리 비활성화 추가
spring:
data:
redis:
repositories:
enabled: false # RedisKeyValueAdapter 자체를 생성하지 않음
방법 2: TestRedisConfig에서 redisTemplate mock 스터빙
@Bean
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> template = Mockito.mock(RedisTemplate.class);
Mockito.when(template.getConnectionFactory()).thenReturn(redisConnectionFactory());
return template;
}
방법 1이 더 깔끔합니다. 프로젝트에서 @RedisHash 엔티티(Redis 레포지토리)를 사용하지 않는다면 테스트에서 RedisKeyValueAdapter 자체를 띄울 필요가 없기 때문입니다.
'Redis' 카테고리의 다른 글
| [Redis] ZSET (0) | 2026.03.27 |
|---|---|
| [Redis] Redis + RedisInsight (0) | 2026.03.27 |