文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Spring Boot 集成 JUnit5,更优雅单元测试!

2024-12-14 01:31

关注

为什么使用JUnit5

简介

如图,JUnit5结构如下:

依赖引入

我们以SpringBoot2.3.1为例,引入如下依赖,防止使用旧的junit4相关接口我们将其依赖排除。 

  1. <dependency>  
  2.     <groupId>org.springframework.bootgroupId>  
  3.     <artifactId>spring-boot-starter-testartifactId>  
  4.     <scope>testscope>  
  5.     <exclusions>  
  6.         <exclusion>  
  7.             <groupId>org.junit.vintagegroupId>  
  8.             <artifactId>junit-vintage-engineartifactId>  
  9.         exclusion>  
  10.     exclusions>  
  11. dependency>  

常用注解

断言

JUnit Jupiter提供了强大的断言方法用以验证结果,在使用时需要借助java8的新特性lambda表达式,均是来自org.junit.jupiter.api.Assertions包的static方法。

assertTrue与assertFalse用来判断条件是否为true或false 

  1. @Test  
  2. @DisplayName("测试断言equals")  
  3. void testEquals() {  
  4.     assertTrue(3 < 4);  

assertNull与assertNotNull用来判断条件是否为·null 

  1. @Test  
  2. @DisplayName("测试断言NotNull")  
  3. void testNotNull() {  
  4.     assertNotNull(new Object());  

assertThrows用来判断执行抛出的异常是否符合预期,并可以使用异常类型接收返回值进行其他操作 

  1. @Test  
  2. @DisplayName("测试断言抛异常")  
  3. void testThrows() {  
  4.     ArithmeticException arithExcep = assertThrows(ArithmeticException.class, () -> {  
  5.         int m = 5/0;  
  6.     });  
  7.     assertEquals("/ by zero", arithExcep.getMessage());  

assertTimeout用来判断执行过程是否超时 

  1. @Test  
  2. @DisplayName("测试断言超时")  
  3. void testTimeOut() {  
  4.     String actualResult = assertTimeout(ofSeconds(2), () -> {  
  5.         Thread.sleep(1000);  
  6.         return "a result";  
  7.     });  
  8.     System.out.println(actualResult); 

assertAll是组合断言,当它内部所有断言正确执行完才算通过 

  1. @Test  
  2. @DisplayName("测试组合断言")  
  3. void testAll() {  
  4.     assertAll("测试item商品下单",  
  5.             () -> {  
  6.                 //模拟用户余额扣减  
  7.                 assertTrue(1 < 2, "余额不足");  
  8.             },  
  9.             () -> {  
  10.                 //模拟item数据库扣减库存  
  11.                 assertTrue(3 < 4);  
  12.             },  
  13.             () -> {  
  14.                 //模拟交易流水落库  
  15.                 assertNotNull(new Object());  
  16.             }  
  17.     );  
  18.  

重复性测试

在许多场景中我们需要对同一个接口方法进行重复测试,例如对幂等性接口的测试。

JUnit Jupiter通过使用@RepeatedTest(n)指定需要重复的次数 

  1. @RepeatedTest(3)  
  2. @DisplayName("重复测试")  
  3. void repeatedTest() {  
  4.     System.out.println("调用");  

 

参数化测试

参数化测试可以按照多个参数分别运行多次单元测试这里有点类似于重复性测试,只不过每次运行传入的参数不用。需要使用到@ParameterizedTest,同时也需要@ValueSource提供一组数据,它支持八种基本类型以及String和自定义对象类型,使用极其方便。 

  1. @ParameterizedTest  
  2. @ValueSource(ints = {1, 2, 3})  
  3. @DisplayName("参数化测试")  
  4. void paramTest(int a) {  
  5.     assertTrue(a > 0 && a < 4);  
  6.  

内嵌测试

JUnit5提供了嵌套单元测试的功能,可以更好展示测试类之间的业务逻辑关系,我们通常是一个业务对应一个测试类,有业务关系的类其实可以写在一起。这样有利于进行测试。而且内联的写法可以大大减少不必要的类,精简项目,防止类爆炸等一系列问题。 

  1. Copy@SpringBootTest  
  2. @AutoConfigureMockMvc  
  3. @DisplayName("Junit5单元测试")  
  4. public class MockTest {  
  5.     //....  
  6.     @Nested  
  7.     @DisplayName("内嵌订单测试")  
  8.     class OrderTestClas {  
  9.         @Test  
  10.         @DisplayName("取消订单")  
  11.         void cancelOrder() {  
  12.             int status = -1;  
  13.             System.out.println("取消订单成功,订单状态为:"+status);  
  14.         }  
  15.     }  
  16.  

 

 

来源:Hollis内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯