千锋教育-做有情怀、有良心、有品质的职业教育机构

手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

当前位置:首页  >  技术干货  > 理解JUnit Jupiter

理解JUnit Jupiter

来源:千锋教育
发布人:xqq
时间: 2023-11-24 11:09:19 1700795359

JUnit Jupiter是JUnit 5的核心测试引擎之一。它是一个注重灵活性和可扩展性的测试框架,包括包括很多新特性和改进。本文将从多个方面对JUnit Jupiter进行详细的阐述。

一、测试体系架构

JUnit Jupiter采用了改良后的测试体系结构和新的测试扩展模型,包括测试执行器和扩展。这些特性使得JUnit Jupiter比起Junit 4更加灵活和可扩展。

在JUnit Jupiter中,测试注解标记在方法上而不是类上。测试用例是通过Java 8的默认接口方法来定义的。JUnit Jupiter支持JUnit 4的许多注解,例如@BeforeAll,@AfterAll,@BeforeEach,@AfterEach,@Test等等。此外,JUnit Jupiter还提供了许多新注解,例如@DisplayName,@Nested,@Tag等,这些注解可以使测试用例更具可读性。

JUnit Jupiter 测试体系结构的关键要素如下:


@TestInstance: 定义测试用例实例。默认测试用例实例为 PerMethod(每个测试用例方法一个实例)。同时,可以配置为 PerClass(每个测试用例类一个实例)。
@DisplayName: 为测试用例方法定义一个可读的名称。它可以替代方法签名作为测试用例名称。
@BeforeAll, @AfterAll, @BeforeEach, @AfterEach: 与 JUnit 4类似,这些注解可以在测试用例中提供额外逻辑。
@Nested: 用来表示嵌套测试用例。
@Tag: 为测试用例方法标记一个或多个标签。
@Disabled: 用来快速禁用一个测试用例方法,将他标记为不可用。
@Tag("IntegrationTest")
@TestInstance(Lifecycle.PER_CLASS)
@DisplayName("SalesOrderRepository Integration Test")
public class SalesOrderRepositoryIT {

    private SalesOrderRepository salesOrderRepository;

    @BeforeAll
    public void setUp() {
        ...
    }

    @Test
    public void testCreateSalesOrder() {
        ...
    }

    @Test
    public void testGetSalesOrder() {
        ...
    }

    @Test
    public void testUpdateSalesOrder() {
        ...
    }

    @AfterAll
    public void tearDown() {
        ...
    }
}

二、参数化测试

JUnit Jupiter引入了参数化测试。在JUnit Jupiter中,通过@TestFactory来创建参数化测试,并使用@ParameterizedTest注解来标记一个需要进行参数化的测试方法。@MethodSource和@CsvSource注解可以用来提供参数。

下面是一个简单的使用@ParameterizedTest测试示例:


@ParameterizedTest(name = "{0} + {1} = {2}")
@CsvSource({ "1, 1, 2", "2, -1, 1", "8, 2, 10", "400, 200, 600" })
public void testAdd(int a, int b, int result) {
    assertEquals(result, a + b);
}

三、测试模板

JUnit Jupiter称之为Test Templates(测试模板)的新特性可以编写可执行的测试用例模板并为其提供参数组合。测试模板由@Template 标记的方法定义,该方法返回一个流或迭代器。测试引擎将为每个模板参数组合调用方法。这非常适合于需要测试多组相似的数据的场景。

下面是简单的使用@Template测试示例:


@DisplayName("Calculator Test")
public class CalculatorTest {
    @Template
    @DisplayName("Addition of {0} and {1} should equal to {2}")
    public void add(int input1, int input2, int expected) {
        Calculator calculator = new Calculator();
        int actual = calculator.add(input1, input2);
        assertEquals(expected, actual);
    }

    @Test
    @DisplayName("method1")
    public void testMethod1() {
        ...
    }

    @Test
    @DisplayName("method2")
    public void testMethod2() {
        ...
    }

    static Stream provideIntegers() {
        return Stream.of(
            Arguments.of(2, 3, 5),
            Arguments.of(0, 0, 0),
            Arguments.of(-1, -1, -2)
        );
    }
}

四、扩展插件

JUnit Jupiter提供了一个强大的扩展插件API,可以通过它来编写插件,并通过各种方法,如@ExtendWith等实现这些插件。JUnit Jupiter提供的扩展包括Test TemplateInvocationContextProvider、TestInstancePostProcessor、TestExecutionExceptionHandler、AfterTestExecutionCallback等。

下面是一个示例TestInstancePostProcessor:


public class TestInstanceLogger implements TestInstancePostProcessor {

    @Override
    public void postProcessTestInstance(Object testInstance, ExtensionContext context) throws Exception {
        System.out.println(String.format("Test Instance [%s] has been created.", testInstance.getClass().getSimpleName()));
    }

}

然后,通过@ExtendWith注解引入扩展:


@ExtendWith(TestInstanceLogger.class)
public class CalculatorTest {
    @Test
    public void testAdd() {
        ...
    }
}

五、与Spring集成

JUnit Jupiter适用于与Spring集成,可以通过依赖注入和库支持来构建强大的测试单元,包括集成测试和单元测试等。

下面是一个使用Spring的@MockBean注解的测试示例:


@SpringBootTest
public class MockBeanExampleTest {

    @MockBean
    private UserRepository userRepository;

    @Autowired
    private UserService userService;

    @Test
    public void testUserService() {
        User user = new User("testuser");
        when(userRepository.findByName("testuser")).thenReturn(user);
        User returnedUser = userService.getUser("testuser");
        assertEquals(user, returnedUser);
        verify(userRepository, times(1)).findByName("testuser");
    }
}

结论

JUnit Jupiter是一个优秀的测试引擎,它可以帮助Java开发者编写高质量、易于维护的测试代码。通过本文我们可以了解JUnit Jupiter的一些核心特性,如测试注解,测试体系结构,参数化测试,测试模板,扩展插件以及与Spring集成。希望这些内容对你有所帮助。

tags: junitjupiter
声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。
10年以上业内强师集结,手把手带你蜕变精英
请您保持通讯畅通,专属学习老师24小时内将与您1V1沟通
免费领取
今日已有369人领取成功
刘同学 138****2860 刚刚成功领取
王同学 131****2015 刚刚成功领取
张同学 133****4652 刚刚成功领取
李同学 135****8607 刚刚成功领取
杨同学 132****5667 刚刚成功领取
岳同学 134****6652 刚刚成功领取
梁同学 157****2950 刚刚成功领取
刘同学 189****1015 刚刚成功领取
张同学 155****4678 刚刚成功领取
邹同学 139****2907 刚刚成功领取
董同学 138****2867 刚刚成功领取
周同学 136****3602 刚刚成功领取
相关推荐HOT