JUnit教程:4与5版本区别及升级步骤,避免踩坑指南

admin 综合编程开发技术 3


项目里还用着 JUnit 4?想升级到 5 又怕出问题?改了几个注解结果测试全爆红?别慌,今天兔子哥就来好好说说 JUnit 4 和 5 的那些区别,升级步骤该咋走,还有那些容易踩的坑怎么绕过去。不管你是刚接触单元测试的新手,还是老项目想升级的老手,看完这篇保准能明白。

一、先搞明白:JUnit 4 和 5 到底差在哪儿?为啥要升级?


可能有朋友会说,我用 4 好好的,没必要升级吧?嗯,这么说也不是不行,但 5 确实香啊。就像手机系统升级,新功能总归方便些。
最明显的就是注解不一样了。比如 4 里的 @Before,到 5 里改成了 @BeforeEach;@After 变成了 @AfterEach。别小看这几个词的变化,5 的注解更直白,一看就知道是 “每个测试前” 还是 “每个测试后”。还有 4 里的 @Test 注解能加超时、预期异常这些属性,5 里不行了,得用专门的注解,比如 @Timeout、@Test (expected = ...) 换成了 assertThrows () 方法。
然后是依赖引入。4 就一个 jar 包,5 拆成了好几个模块,比如 junit-jupiter-api(写测试用)、junit-jupiter-engine(运行测试用)。这样想引哪个就引哪个,不用一股脑全下下来,省点空间不是。
哦对了,5 还支持Java 8 及以上的新特性,像 Lambda 表达式、Stream 这些,写测试能更简洁。比如参数化测试,5 比 4 灵活多了,这也是很多人升级的原因。
但话说回来,要是你项目还在用 Java 7 及以下,那还是老老实实用 4 吧,5 不支持呢。

二、升级步骤:三步走,从依赖到代码慢慢改


升级不用一下子全改完,一步一步来更稳妥,兔子哥教你三步法:
第一步,换依赖。这是最基本的,Maven 项目的话,先把 pom.xml 里 JUnit 4 的依赖删掉,比如:
xml
<dependency><groupId>junitgroupId><artifactId>junitartifactId><version>4.13.2version><scope>testscope>dependency>

换成 JUnit 5 的:
xml
<dependency><groupId>org.junit.jupitergroupId><artifactId>junit-jupiter-apiartifactId><version>5.9.2version><scope>testscope>dependency><dependency><groupId>org.junit.jupitergroupId><artifactId>junit-jupiter-engineartifactId><version>5.9.2version><scope>testscope>dependency>

Gradle 项目也类似,改 build.gradle 里的依赖就行。
第二步,改注解。这步最容易出错,最好拿个小本本记下来:
  • @Test:保留,但 4 里的属性(如 timeout)要去掉
  • @Before → @BeforeEach
  • @After → @AfterEach
  • @BeforeClass → @BeforeAll(注意这个方法要加 static)
  • @AfterClass → @AfterAll(同样要 static)
  • @Ignore → @Disabled

改的时候别漏掉哪个测试类,不然运行的时候准报错。可以先挑一两个简单的测试类试试水,没问题了再批量改。
第三步,处理断言和异常测试。4 里的断言是 org.junit.Assert,5 里换成了 org.junit.jupiter.api.Assertions,静态导入的包变了,得重新导一下。比如 assertEquals,以前是 import static org.junit.Assert.assertEquals; 现在要改成 import static org.junit.jupiter.api.Assertions.assertEquals;
还有测试异常,4 里可以这么写:@Test (expected = NullPointerException.class),5 里得用 assertThrows:
java运行
// JUnit 5写法@Testvoid testException() {assertThrows(NullPointerException.class, () -> {// 会抛出空指针的代码String str = null;str.length();});}

刚开始可能不习惯,多写两个就顺手了。

三、那些年踩过的坑,你可别再掉进去


升级的时候,兔子哥见过不少人栽跟头,这些坑得提前知道:
第一个坑,依赖没导全。只导了 junit-jupiter-api,没导 engine,结果测试跑不起来,还以为是代码错了。记住啊,api 是写测试用的,engine 是让测试能跑的,俩都得有。
第二个坑,@BeforeAll 方法忘了加 static。JUnit 5 里这个注解的方法必须是静态的,不像 4 里可以不是。要是忘了加 static,运行就报 “Method ... must be static”,新手很容易在这卡壳。
第三个坑,和 Mockito 版本不兼容。如果你项目里用了 Mockito,升级 JUnit 后最好也把 Mockito 升到最新版。比如 Mockito 2.x 可能不支持 JUnit 5,得用 3.x 及以上,不然会有各种奇奇怪怪的错误。
第四个坑,批量替换注解太急。有的人图省事,用 IDE 的全局替换把 @Before 全换成 @BeforeEach,结果把别的类里的注解也误改了,比如非测试类里碰巧有个 @Before 注解(虽然很少见)。最好还是一个类一个类检查着改。

四、到底要不要升级?兔子哥给点实在建议


其实升不升级,得看你项目情况。要是新项目,直接用 5 就行,不用犹豫;老项目的话,如果团队人力够,慢慢升挺好的,毕竟 5 的新功能确实方便。但要是项目特别老,还在用 Java 7,那就算了,强行升级麻烦太多。
升级的时候别想着一口吃个胖子,分阶段来。先把依赖换了,改几个测试类试试水,跑通了再大面积改。遇到问题别慌,大部分错误都是注解没改对或者依赖没配好,仔细看看报错信息,一般都能解决。
兔子哥团队之前升级的时候,也是磕磕绊绊,改着改着就熟练了。现在用 5 写测试,尤其是参数化测试,比以前省事儿多了。所以啊,别怕麻烦,升级完你会发现真香。
希望这篇教程能帮到想升级 JUnit 的朋友,少踩点坑,升级顺利。有啥问题欢迎留言,咱们一起讨论讨论。

标签: junit-jupiter-engine junit-jupiter-api

发布评论 0条评论)

  • Refresh code

还木有评论哦,快来抢沙发吧~