1. 引言

在 JUnit 5 中,@RunWith 注解已被更强大的 @ExtendWith 注解取代。不过为了向后兼容,JUnit 5 仍然支持 @RunWith。本文将探讨在 JUnit 5 框架中使用 @RunWith 注解的场景和注意事项。

2. 使用 JUnit 4 运行器执行测试

通过 @RunWith 注解,我们可以在仅支持 JUnit 4 的环境中运行 JUnit 5 测试。比如在旧版 Eclipse 中:

适用场景:需要在 JUnit 4 环境中运行 JUnit 5 测试
⚠️ 限制:无法使用 JUnit 5 的新特性

首先创建被测类:

public class Greetings {
    public static String sayHello() {
        return "Hello";
    }  
}

然后编写基础 JUnit 5 测试:

public class GreetingsUnitTest {
    @Test
    void whenCallingSayHello_thenReturnHello() {
        assertTrue("Hello".equals(Greetings.sayHello()));
    }
}

最后添加注解使其可运行:

@RunWith(JUnitPlatform.class)
public class GreetingsUnitTest {
    // ...
}

JUnitPlatform 是基于 JUnit 4 的运行器,允许在 JUnit Platform 上运行测试。但需注意:JUnit 4 不支持新平台的所有特性,因此功能受限

在 Eclipse 中运行测试时,会显示使用的是 JUnit 4 运行器:

junit4 test

3. 在 JUnit 5 环境中运行测试

在支持 JUnit 5 的环境中(如新版 Eclipse),无需 @RunWith 注解:

public class GreetingsUnitTest {
    @Test
    void whenCallingSayHello_thenReturnHello() {
        assertTrue("Hello".equals(Greetings.sayHello()));
    }
}

测试结果会明确显示使用的是 JUnit 5 运行器:

junit5 test

4. 从 JUnit 4 运行器迁移

迁移使用 JUnit 4 运行器的测试时,需用 @ExtendWith 替换 @RunWith。以 Spring 测试为例:

迁移前

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { SpringTestConfiguration.class })
public class GreetingsSpringUnitTest {
    // ...
}

迁移后

@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = { SpringTestConfiguration.class })
public class GreetingsSpringUnitTest {
    // ...
}

SpringExtension 由 Spring 5 提供,用于将 Spring TestContext 框架集成到 JUnit 5。@ExtendWith 可接受任何实现 Extension 接口的类。

5. 总结

本文探讨了在 JUnit 5 中使用 JUnit 4 的 @RunWith 注解的场景:

  • ✅ 在旧环境中运行 JUnit 5 测试
  • ❌ 无法使用 JUnit 5 新特性
  • ⚠️ 迁移时需替换为 @ExtendWith

完整代码示例可在 GitHub 获取。


原始标题:JUnit5 @RunWith