你遇到的問題是:
RedisConnectionFactory redisConnectionFactory 在單元測試中為 null
這是 Spring Boot 單元測試中非常常見的問題,根本原因是你的測試類沒有啟用 Spring 容器上下文,導致 @Resource 注解無法注入 Bean。
? 正確做法:使用 Spring Boot 的單元測試支持
? 1. 添加必要的注解
你需要在你的測試類上加上如下兩個關鍵注解:
Java
深色版本
@RunWith(SpringRunner.class)
@SpringBootTest
這樣 Spring 才能啟動上下文,并完成自動裝配。
? 2. 修改后的完整代碼如下:
Java
深色版本
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import javax.annotation.Resource;
import java.util.Properties;
@RunWith(SpringRunner.class) ? ? ? ?// 啟用 Spring 測試支持
@SpringBootTest ? ? ? ? ? ? ? ? ? ? ?// 啟動 Spring Boot 上下文
public class RedisConnectionFactoryTest {
? ? @Resource
? ? private RedisConnectionFactory redisConnectionFactory;
? ? @Test
? ? public void test1() {
? ? ? ? // 默認 class org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory
? ? ? ? System.out.println(redisConnectionFactory.getClass());
? ? ? ? // 當前db的key數量
? ? ? ? Long keyCount = redisConnectionFactory.getConnection().dbSize();
? ? ? ? System.out.println("當前db的key數量 = " + keyCount);
? ? ? ? Properties properties = redisConnectionFactory.getConnection().info();
? ? ? ? System.out.println(properties);
? ? }
}
📌 注意事項:
如果你在項目中同時配置了 Jedis 和 Lettuce(如你的 application.yml 所示),Spring Boot 默認會優先使用 Lettuce。
確保你的 Redis 服務器可以被訪問:
IP、端口是否正確?
是否有防火墻限制?
密碼是否正確?
🔍 可選:查看當前使用的 Redis 客戶端類型
你可以通過打印 redisConnectionFactory 的類型來確認當前使用的是哪個客戶端:
Java
深色版本
System.out.println(redisConnectionFactory.getClass());
// 輸出示例:class org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory
? 補充說明:為什么之前為空?
你原來的測試類只是一個普通的 JUnit 測試類,沒有加載 Spring 上下文,所以 Spring 無法識別 @Resource 或 @Autowired 注解,也就不會為你注入任何 Bean。
原因?? ?解釋
沒有 @SpringBootTest?? ?Spring 上下文未啟動,Bean 無法注入
沒有 @RunWith(SpringRunner.class)?? ?JUnit 不知道要和 Spring 集成
所以 redisConnectionFactory == null?? ?Spring 沒有注入
? 總結
問題?? ?原因?? ?解決方案
redisConnectionFactory 為 null?? ?沒有啟用 Spring 上下文?? ?添加 @SpringBootTest 和 @RunWith(SpringRunner.class)
無法連接 Redis?? ?配置錯誤或網絡不通?? ?檢查 Redis 地址、密碼、端口、防火墻等
不確定使用的是 Jedis 還是 Lettuce?? ?默認是 Lettuce?? ?查看 redisConnectionFactory.getClass()