Java JUnit 5注解的区别

31

根据JUnit 5用户指南介绍,新的JUnit Jupiter被引入。

JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage

我对库中使用的同名注解感到困惑。这两个之间有什么显著的区别吗?

  • org.junit.Test
  • org.junit.jupiter.api.Test
上面链接页面的描述解释了注解org.junit.jupiter.api.Test如下:
表示一个方法是测试方法。与JUnit 4的@Test注解不同,这个注解不声明任何属性,因为JUnit Jupiter中的测试扩展是基于它们自己的专用注解运作的。这样的方法是继承的,除非它们被覆盖。
据我所知,主要区别在于新的注解属性被专用注解和方法(例如assertTimeout(...))所取代,而不是旧的@Test(timeout = 1000)
文档讲述了JUnit 4中的旧注解org.junit.Test,但并没有清楚地解释版本JUnit 5中相同注解的目的,令我惊讶的是,它没有标记为@Deprecated,这意味着在JUnit 5中仍然可以使用此注解,我是对的吗?
我的问题是:JUnit 5中org.junit.Test的目的是什么,为什么它没有被弃用,我应该基于上述两个注解做出什么选择。

"JUnit 5" 不包含 org.junit.Test ... 在此浏览 API:https://junit.org/junit5/docs/snapshot/api - Sormuras
1个回答

29

org.junit.Test不是JUnit5的一部分,它是由您对JUnit Vintage的依赖提供的。

JUnit Vintage包括JUnit Vintage测试引擎和诸如org.junit.Test之类的类,这使您可以在JUnit5测试旁边运行JUnit4测试。这是一种向后兼容措施。

如果您想仅使用JUnit5构造(并将JUnit4排除在项目之外),则只需删除对JUnit Vintage的依赖,并专注于org.junit.jupiter.api.Test

如果您需要同时运行JUnit4和JUnit5测试(例如在迁移/切换期间),则保留对JUnit Vintage的依赖,但使用org.junit.jupiter.api.Test编写所有新测试用例。

更新:针对此问题的回答...

我仍然不明白为什么org.junit.Test没有被弃用。

它在JUnit Jupiter中不存在(因此取消弃用是无意义的),并且在JUnit Vintage中没有被弃用,因为它是JUnit Vintage的核心元素。但是,我想我知道你在哪里; 您升级到JUnit5,并且令人困惑的是,org.junit.Test仍然可在类路径中使用,而没有@Deprecated,因此没有明确指示其“不要使用”的状态。也许您应该考虑一下是否希望/需要在运行JUnit5时支持任何JUnit4结构。如果您不需要,则只需不包括对JUnit Vintage的依赖项,就好像org.junit.Test从未存在过一样。


谢谢,我现在有点清楚了。但我仍然不明白为什么org.junit.Test没有被弃用。 - Nikolas Charalambidis
是的,当我第一次升级到JUnit5时,我也有类似的想法。然而,那时我进行了从JUnit4到JUnit5的完整迁移,因此我不需要任何JUnit4构造。这使我能够删除对JUnit Vintage的依赖,因此JUnit4命名空间(包括org.junit.Test)不再可用。 - glytching

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接