報錯信息如下所示:
五月 30, 2025 5:35:44 下午 org.junit.vintage.engine.descriptor.RunnerTestDescriptor warnAboutUnfilterableRunner 警告: Runner org.junit.internal.runners.ErrorReportingRunner (used on class redis.demo.RedisTemplateTest) does not support filtering and will therefore be run completely. org.junit.runners.model.InvalidTestClassError: Invalid test class 'redis.demo.RedisTemplateTest': 1. No runnable methods at org.junit.runners.ParentRunner.validate(ParentRunner.java:525) at org.junit.runners.ParentRunner.<init>(ParentRunner.java:92) at org.junit.runners.BlockJUnit4ClassRunner.<init>(BlockJUnit4ClassRunner.java:74) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.<init>(SpringJUnit4ClassRunner.java:137) at org.springframework.test.context.junit4.SpringRunner.<init>(SpringRunner.java:49)
你遇到的這個錯誤:
深色版本
No runnable methods
以及這個警告:
深色版本
Runner org.junit.internal.runners.ErrorReportingRunner (used on class redis.demo.RedisTemplateTest) does not support filtering and will therefore be run completely.
說明 JUnit 沒有識別到你的測試方法,也就是說,它找不到任何可以運行的 @Test 方法。
🔍 原因分析
你當前的單元測試類中混合使用了 JUnit 4 和 JUnit Jupiter (JUnit 5) 的注解和機制,這是導致問題的根本原因!
? 你的代碼結構如下:
Java
深色版本
import org.junit.jupiter.api.Test; ? ? ? ? ? ? ?// JUnit 5 注解
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.runner.RunWith; ? ? ? ? ? ? ? ?// JUnit 4 注解
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.context.junit.jupiter.SpringExtension;
@ExtendWith(SpringExtension.class)
@RunWith(SpringRunner.class)
@SpringBootTest(classes = App.class)
public class RedisTemplateTest {
? ? @Test
? ? public void test1() {
? ? ? ? ...
? ? }
}
? 問題點總結:
問題?? ?說明
混合使用 JUnit 4 和 JUnit 5?? ?@RunWith 和 @SpringRunner 是 JUnit 4 的機制,而 @ExtendWith 和 @org.junit.jupiter.api.Test 是 JUnit 5 的方式
SpringRunner 不兼容 JUnit 5 的測試引擎?? ?SpringRunner 是為 JUnit 4 設計的,無法正確驅動 JUnit 5 的測試
導致“no runnable methods”?? ?因為 JUnit 4 找不到 JUnit 5 的 @Test 方法
? 正確解決方案(推薦使用 JUnit 5)
? 方式一:全部使用 JUnit 5(推薦)
修改你的測試類如下:
Java
深色版本
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import javax.annotation.Resource;
// 使用 JUnit 5 的擴展模型 + SpringExtension
@ExtendWith(SpringExtension.class)
@SpringBootTest(classes = App.class)
public class RedisTemplateTest {
? ? @Resource
? ? private RedisTemplate<Object, Object> redisTemplate;
? ? /**
? ? ?* 自定義redisTemplate存取字符串
? ? ?*/
? ? @Test
? ? void test1() {
? ? ? ? redisTemplate.opsForValue().set("key1", "key1_value");
? ? ? ? Object key1ObjResult = redisTemplate.opsForValue().get("key1");
? ? ? ? System.out.println("strResult = " + key1ObjResult);
? ? }
}
? 方式二:如果你堅持用 JUnit 4
那就把所有注解換成 JUnit 4 的風格:
Java
深色版本
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = App.class)
public class RedisTemplateTest {
? ? @Resource
? ? private RedisTemplate<Object, Object> redisTemplate;
? ? @Test
? ? public void test1() {
? ? ? ? redisTemplate.opsForValue().set("key1", "key1_value");
? ? ? ? Object key1ObjResult = redisTemplate.opsForValue().get("key1");
? ? ? ? System.out.println("strResult = " + key1ObjResult);
? ? }
}
🧪 總結對比表
內容?? ?JUnit 5(推薦)?? ?JUnit 4
測試注解?? ?org.junit.jupiter.api.Test?? ?org.junit.Test
啟動器注解?? ?@ExtendWith(SpringExtension.class)?? ?@RunWith(SpringRunner.class)
Maven 依賴?? ?需要 junit-jupiter-api, junit-jupiter-engine?? ?需要 junit
Spring Boot 默認支持?? ?Spring Boot 2.2+ 支持良好?? ?老項目常用
? 最終建議
如果你使用的是 Spring Boot 2.x 或以上版本,強烈推薦使用 JUnit 5。
刪除多余的 JUnit 4 注解如 @RunWith。
確保你的 pom.xml 中引入了正確的 JUnit 5 依賴:
Xml
深色版本
<dependency>
? ? <groupId>org.junit.jupiter</groupId>
? ? <artifactId>junit-jupiter</artifactId>
? ? <version>5.9.3</version> <!-- 使用最新穩定版 -->
? ? <scope>test</scope>
</dependency>
如果你不確定應該使用哪種方式,或者想查看完整的 pom.xml 配置、如何遷移 JUnit 4 到 JUnit 5,也可以繼續問我,我可以幫你一步步升級 😄