在编写单元测试时,我们经常需要在每个测试方法执行前后做一些通用操作,比如初始化资源或清理数据。JUnit 提供了 @Before和 @After 注解来满足这个需求。
但如果不小心写错了方法的修饰符,可能会遇到一个让人困惑的错误:
initializationError(...)
java.lang.Exception: No tests found matching ...
一、问题重现
我们写了这样一个测试类:
@Before
private void startInfo() {
System.out.println("======开始测试前要做什么事情!======");
}
@After
private void endInfo() {
System.out.println("======结束测试后要做什么事情!======");
}
@Test
public void testMethod() {
System.out.println("测试方法执行中...");
}
运行测试后,JUnit 直接报错 `No tests found`,甚至连 `testMethod` 都没有执行。
二、原因分析
JUnit 的注解有一套明确的访问级别要求:
| 注解 | 要求修饰符 |
@Before / @After | public |
@BeforeClass / @AfterClass | public static |
| @Test | public |
三、解决方案
将 @Before 和 @After 方法的修饰符改为 public:
@Before
public void startInfo() {
System.out.println("======开始测试前要做什么事情!======");
}
@After
public void endInfo() {
System.out.println("======结束测试后要做什么事情!======");
}
@Test
public void testMethod() {
System.out.println("测试方法执行中...");
}
再运行测试,一切正常,输出如下:
======开始测试前要做什么事情!======
测试方法执行中...
======结束测试后要做什么事情!======
四、知识点回顾
为了减少类似问题,建议记住 JUnit 4 核心注解的规范:
- @Test→ public void
- @Before / @After → public void
- @BeforeClass / @AfterClass → public static void
如果你使用的是 JUnit 5(Jupiter),则不再要求
public,但方法至少是package-private。不过为了清晰和兼容,依然推荐写public。
五、小结
一个小小的 private 修饰符,可能会让 JUnit “看不见”你的测试方法,从而报出 `No tests found` 这样的误导性错误。
遇到这个问题时,不妨先检查一下所有带 @Before、@After、@Test 注解的方法是否都是 public 的。
希望这个案例能帮你节省排查时间,写出更规范的单元测试。
记录于 2020 年 2 月 8 日,一个让人尴尬又难忘的微笑时刻。
欢迎关注【JUnit 异常问题系列】,后续会继续整理更多实战中的“坑”。

本文记录了一次在单元测试中使用Junit时遇到的问题及解决过程。作者在定义@Before和@After注解的方法时遇到了错误,通过调整代码使其正确运行。文章详细解释了Junit基本注解的作用,并提供了正确的注解使用示例。
:`@Before` `@After` 方法为何导致“No tests found”?&spm=1001.2101.3001.5002&articleId=104222740&d=1&t=3&u=1274253bff924c97b2ccd36f36bdd56d)
976

被折叠的 条评论
为什么被折叠?



