JUnit 测试中的常见异常(一):`@Before` / `@After` 方法为何导致“No tests found”?

本文记录了一次在单元测试中使用Junit时遇到的问题及解决过程。作者在定义@Before和@After注解的方法时遇到了错误,通过调整代码使其正确运行。文章详细解释了Junit基本注解的作用,并提供了正确的注解使用示例。

在编写单元测试时,我们经常需要在每个测试方法执行前后做一些通用操作,比如初始化资源或清理数据。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 / @Afterpublic
@BeforeClass / @AfterClasspublic static
@Testpublic

三、解决方案

将 @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 异常问题系列】,后续会继续整理更多实战中的“坑”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值