单元测试报错

报错信息如下所示:

五月 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,也可以继续问我,我可以帮你一步步升级 😄

相关推荐
安冬的码畜日常14 小时前
【JUnit实战3_29】第十八章:REST API 接口测试(上)——RESTful 风格的后端 API 的搭建
测试工具·单元测试·restful·rest api·junit 5
安冬的码畜日常18 小时前
【JUnit实战3_30】第十八章:REST API 接口测试(下)—— REST API 接口的 MockMvc + JUnit 5 测试实战
测试工具·junit·单元测试·restful·rest api·junit5
慧都小项1 天前
Parasoft C/C++test如何使用桩函数替代MFC窗口类顺利执行单元测试
单元测试·parasoft·桩函数·mfc窗口类
慧都小项1 天前
Parasoft C/C++test中Trace32调试器的配置与单元测试执行
单元测试·parasoft·trace32调试器
JosieBook2 天前
【SpringBoot】31 核心功能 - 单元测试 - JUnit5 单元测试中的断言机制——验证你的代码是否按预期执行了
spring boot·单元测试·log4j
l1t2 天前
编译SQLite 3.51源码并体验新功能
单元测试·sqlite·duckdb
川石课堂软件测试3 天前
Python | 高阶函数基本应用及Decorator装饰器
android·开发语言·数据库·python·功能测试·mysql·单元测试
Filotimo_3 天前
springboot的单元测试功能有什么用
spring boot·单元测试·log4j
不光头强3 天前
Spring整合单元测试
spring·单元测试·log4j
慧都小项3 天前
Parasoft C/C++test如何在CCS3环境下进行F2812项目的单元测试
单元测试·parasoft·ccs3