Redis

[트러블슈팅] ConnectionFactory must not be null 에러 해결하기

montmer27 2026. 5. 6. 17:04

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