Junit 5(二)

本贴最后更新于 1325 天前,其中的信息可能已经事过境迁

1、 生命周期方法

测试方法:任何用@Test@RepeatedTest@ParameterizedTest@TestFactory 标记的方法。

生命周期方法@BeforeAll@AfterAll@BeforeEach@AfterEach

import static org.junit.jupiter.api.Assertions.fail; import static org.junit.jupiter.api.Assumptions.assumeTrue; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; class StandardTests { @BeforeAll static void initAll() { System.out.println("@BeforeAll......."); } @BeforeEach void init() { System.out.println("@BeforeEach.........."); } @Test void succeedingTest() { System.out.println("succeedingTest.........."); } @Test void failingTest() { fail("a failing test"); } @AfterEach void tearDown() { System.out.println("@AfterEach........."); } @AfterAll static void tearDownAll() { System.out.println("@AfterAll........."); } }

输出结果:

输出: @BeforeAll....... @BeforeEach.......... succeedingTest.......... @AfterEach......... @BeforeEach.......... org.opentest4j.AssertionFailedError: a failing test at org.junit.jupiter.api.AssertionUtils.fail(AssertionUtils.java:39) at org.junit.jupiter.api.Assertions.fail(Assertions.java:117) @AfterEach......... @AfterAll.........

2、显示名称

测试类和测试方法可以使用@DisplayName设置名称,这些名称将显示在测试报告中以及测试运行程序和 IDE 中。

import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @DisplayName("A special test case") class DisplayNameDemo { @Test @DisplayName("Custom test name containing spaces") void testWithDisplayNameContainingSpaces() { } @Test @DisplayName("╯°□°)╯") void testWithDisplayNameContainingSpecialCharacters() { } @Test @DisplayName("?") void testWithDisplayNameContainingEmoji() { } }

IDEA插件显示:

QQ截图20210723161922.png

import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @DisplayName("A special test case") class DisplayNameDemo { @Test @DisplayName("Custom test name containing spaces") void testWithDisplayNameContainingSpaces() { } @Test @DisplayName("╯°□°)╯") void testWithDisplayNameContainingSpecialCharacters() { } @Test @DisplayName("?") void testWithDisplayNameContainingEmoji() { } }

3、断言

Junit 5 附带了 JUnit 4 拥有的许多断言方法,并添加了一些非常适合与 Java 8 lambda 一起使用的断言方法。所有 JUnit Jupiter 断言都是类中的static方法org.junit.jupiter.api.Assertions

import static java.time.Duration.ofMillis; import static java.time.Duration.ofMinutes; import java.util.concurrent.CountDownLatch; import example.domain.Person; import example.util.Calculator; import org.junit.jupiter.api.Test; class AssertionsDemo { private final Calculator calculator = new Calculator(); private final Person person = new Person("Jane", "Doe"); @Test void standardAssertions() { assertEquals(2, calculator.add(1, 1)); assertEquals(4, calculator.multiply(2, 2), "The optional failure message is now the last parameter"); assertTrue('a' < 'b', () -> "Assertion messages can be lazily evaluated -- " + "to avoid constructing complex messages unnecessarily."); } @Test void exceptionTesting() { Exception exception = assertThrows(ArithmeticException.class, () -> calculator.divide(1, 0)); assertEquals("/ by zero", exception.getMessage()); } @Test void timeoutExceeded() { assertTimeout(ofMillis(10), () -> { Thread.sleep(100); }); } }

3.1、第三方断言库

尽管 JUnit 5 提供的断言工具足以满足许多测试场景,但有时需要或需要更多功能和附加功能(例如 匹配器)。在这种情况下,JUnit 团队建议使用第三方断言库,例如AssertJHamcrestTruth等。因此开发人员可以自由使用他们选择的断言库。

以下示例演示了使用 Hamcrest 库的断言方法,只要将 Hamcrest 库添加到类路径中,就可以静态导入assertThat()is()、 等方法equalTo(),然后在测试中使用它们,如assertWithHamcrestMatcher()下面的方法所示。

import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import example.util.Calculator; import org.junit.jupiter.api.Test; class HamcrestAssertionsDemo { private final Calculator calculator = new Calculator(); @Test void assertWithHamcrestMatcher() { assertThat(calculator.subtract(4, 1), is(equalTo(3))); } }
1 操作
luojie 在 2021-07-29 15:53:48 更新了该帖
回帖
请输入回帖内容 ...