1. 总览
JUnit现在是Java最流行的测试框架之一,所以当它在今年2月发布最新JUnit5的Alpha版本的时候,在Java开发者社区也引起了极大的讨论。最新版Junit5引入了诸多创新与变革。文章接下来会简单介绍关于JUnit5的一些变更与新特性。
2. 引入POM依赖
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.1.0</version>
<scope>test</scope>
</dependency>
如果你不使用任何IDE,或者当前正在使用的IDE无法支持到JUnit5,也可以引入以下pom插件来提供支持:
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19.1</version>
<dependencies>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-surefire-provider</artifactId>
<version>1.0.2</version>
</dependency>
</dependencies>
</plugin>
需要特别注意一下的是JUnit5只支持Java8。
同时当你创建一个测试类的时候,记得引入包 org.junit.jupiter.api.Test 而不是 org.junit.Test,而且在新版本中,测试方法不再必须要求是public的了。
3. 新特性
3.1. 断言 Assertion
断言已经移动到了包org.junit.jupiter.api.Assertions中,得到到极大的升级,并且和Java8一道,提供对Lambda表达式的支持。如下事例:
@Test
void lambdaExpressions() {
assertTrue(Stream.of(1, 2, 3)
.stream()
.mapToInt(i -> i)
.sum() > 5, () -> "Sum should be greater than 5");
}
需要注意到Lambda的断言语句是(延迟)Lazy加载的,这对于那些需要花费资源进行构建的断言语句来说可以提高测试Case的执行性能。
现在你也可以通过assertAll()来进行一组复数断言,MultipleFailuresError支持一组断言中返回失败的信息。这意味着你可以同时创建更为复杂的断言,并且能很快定位到错误。
@Test
void groupAssertions() {
int[] numbers = {0, 1, 2, 3, 4};
assertAll("numbers",
() -> assertEquals(numbers[0], 1),
() -> assertEquals(numbers[3], 3),
() -> assertEquals(numbers[4], 1)
);
}
3.2. 假设(Assumptions)
有时候测试需要在满足某种条件的时候才被允许执行,一般是一些外部的条件用来保证测试的正常进行,而其本身并不会直接与被测试的数据关联的时候。
你可以用assumeTrue(), assumeFalse(), and assumingThat().来声明假设。
@Test
void trueAssumption() {
assumeTrue(5 > 1);
assertEquals(5 + 2, 7);
}
@Test
void falseAssumption() {
assumeFalse(5 < 1);
assertEquals(5 + 2, 7);
}
@Test
void assumptionThat() {
String someString = "Just a string";
assumingThat(
someString.equals("Just a string"),
() -> assertEquals(2 + 2, 4)
);
}
如果assumption没有被满足的时候,会抛出一个TestAbortedException异常并跳过该测试。如上例所示,assumption支持Lambda表达式。
3.3. 异常(Exception)
JUnit5增强了对异常测试的支持,新增assertThrows()语句来验证抛出特定类型的异常。
@Test
void shouldThrowException() {
Throwable exception = assertThrows(UnsupportedOperationException.class, () -> {
throw new UnsupportedOperationException("Not supported");
});
assertEquals(exception.getMessage(), "Not supported");
}
网友评论