全国旗舰校区

不同学习城市 同样授课品质

北京

深圳

上海

广州

郑州

大连

武汉

成都

西安

杭州

青岛

重庆

长沙

哈尔滨

南京

太原

沈阳

合肥

贵阳

济南

下一个校区
就在你家门口
+
当前位置:首页  >  技术干货

理解JUnit Jupiter

发布时间:2023-11-24 11:09:19
发布人:xqq

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集成。希望这些内容对你有所帮助。

junitjupiter

相关文章

sqlserver去重的几种方法

sqlserver去重的几种方法

2023-11-24
linux文件所属分区,linux分区文件类型

linux文件所属分区,linux分区文件类型

2023-11-24
Access-Control详解

Access-Control详解

2023-11-24
Neo4j删除关系的多个方面详述

Neo4j删除关系的多个方面详述

2023-11-24

最新文章

武汉新媒体行业公司排名

武汉新媒体行业公司排名

2023-11-01
武汉新媒体就业现状好吗

武汉新媒体就业现状好吗

2023-11-01
武汉全媒体行业发展现状及趋势

武汉全媒体行业发展现状及趋势

2023-10-31
武汉全媒体现状

武汉全媒体现状

2023-10-31