关于JUnit 5迁移的好处之一是,您可以在老式模式下运行JUnit 4测试,并且所有内容仍然兼容。 不利的一面是,某些注释和方法在JUnit 4和JUnit 5中具有相同的名称,并且当两组库依赖项都可用时,很容易导入错误的内容并产生不符合要求的测试。努力工作。
但是,更糟糕的是,当没有意义的测试也没有使构建失败时。
考虑以下测试:
import org.junit.Test; import org.junit.jupiter.api.BeforeEach; import static org.junit.Assert.assertEquals; public class AccidentalJUnit4Test { @BeforeEach public void beforeEach() { } @Test public void test() { assertEquals( 1 , 1 ); } }
这是JUnit 5的注释和JUnit 4的一些可怕的汤。 它在IDE中运行,但是在maven构建中,它被忽略了,因为@Test
来自错误的JUnit,并且我没有运行junit-vintage
。
那么运行junit-vintage
吗?
这是怎么发生的?
就我而言,我已经导入了JUnit 5的TestContainers
集成,该集成具有对JUnit 4的传递依赖。这不是很好,但还不是世界末日。 但是,我只希望代码中包含JUnit 5测试,但是我可能会意外地用JUnit 4位编写测试,没有人会注意到!
这些一半形式的测试从未打算如此,因此我希望它们使构建失败。
什么不起作用
- Checkstyle – checkstyle可以扫描禁止的
import
语句,但是我不使用它进行src/test
扫描,并且我们项目的checkstyle规则与另一个使用junit-vintage
的有效项目共享。 - Macker –复杂的扫描仪,似乎开箱即用
- Enforcer –这将使我无法包括JUnit 4依赖项……只是我忍不住允许了
我为什么要在乎?
通过增加自动化功能来发现已知错误并告诉您有关错误的信息,这比在周围发出警告要好得多,而且仍然可能出现错误,从而使事情变得防错。
就像有人张贴标语来警告该水非常热,而不是在适当的温度下提供水一样!
任何可以赋予我们强制功能的东西都是有好处的。
什么有效
我在GitHub上找到了一个愚蠢而简单的答案。
这个Maven Grep插件效果很好:
< build > < plugins > <!-- grep maven plugin set to filter naughty JUnit4 stuff --> < plugin > < groupId >net.radai</ groupId > < artifactId >grep-maven-plugin</ artifactId > < version >1.1</ version > < executions > < execution > < goals > < goal >grep</ goal > </ goals > < phase >test</ phase > < configuration > < greps > < grep > < failIfFound >true</ failIfFound > < filePattern >src/test/java/**/*.java</ filePattern > < grepPattern >import\s+(static\s+)?org\.junit\.(Assert|Test|Before|After|AfterClass|Assume|BeforeClass|ClassRule|Rule|FixMethodOrder|Ignore|Rule)</ grepPattern > < outputPattern >Found JUnit 4 imports in file ${fileName} at line ${lineNumber} : ${line}</ outputPattern > </ grep > </ greps > </ configuration > </ execution > </ executions > </ plugin > </ plugins > </ build > <!-- you also need to add the distribution repo --> < pluginRepositories > < pluginRepository > < id >ossrh</ id > < url > https://oss.sonatype.org/content/groups/public </ url > </ pluginRepository > </ pluginRepositories >
以上内容对我来说可以防止发生错误,它可能对您有用。
我在GitHub中放置了上述代码的一个工作示例(由于正确的原因而失败)。
信用到期
我几乎放弃了上述问题。 幸运的是,开源社区非常出色。
Radai Rosenblatt于2016年编写了此插件。一个名为Michal Lozinski的撰稿人于2017年添加了文件模式扫描。
当我们第一次尝试使用上述配置时,它没有用。 文档没有描述如何执行此操作,但是阅读插件的代码显示可以使用filePattern
。 但是,它没有用。
我今天联系了Radai,他更新了该插件的发行版,现在可以使用了。
没有开源,这是不可能的。 没有作者承担对陌生人的帮助的责任,这是不可能的。
谢谢!!!
翻译自: https://www.javacodegeeks.com/2019/08/crossing-junit-streams.html