前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Junit5系列-Junit5中Assumptions假设类

Junit5系列-Junit5中Assumptions假设类

作者头像
洋仔聊编程
发布2019-01-15 16:47:15
1.3K0
发布2019-01-15 16:47:15
举报

简介

在Junit5中的JUnit Jupiter模块附带了JUnit 4提供的假设方法的一个子集,并添加了一些非常适合与Java 8 lambdas一起使用的方法。 所有JUnit Jupiter假设测试方法都是org.junit.jupiter.api.Assumptions类中的静态方法。

Assumptions类顾名思义是假设的意思也就是做一些假设,只有当假设成功后才会执行接下来的代码。说的再详细不如实践,下面看一下案例。

使用Assumptions类中的假设方法时,当假设不成立时会报错,但是测试会显示被ignore忽略执行。也就是当我们一个类中有多个测试方法时,其中一个假设测试方法假设失败,其他的测试方法全部成功,那么该测试类也会显示测试成功! 这说明假设方法适用于:在不影响测试是否成功的结果的情况下根据不同情况执行相关代码!

可以看下面一个案例:

在这里插入图片描述
在这里插入图片描述

案例解析

其中每个方法的作用代码中的注释写的已经非常清楚了,就不再赘述了.

大家最好将代码自己测试一遍,可以加深理解与记忆!

案例代码:

代码语言:javascript
复制
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assumptions.assumeFalse;
import static org.junit.jupiter.api.Assumptions.assumeTrue;
import static org.junit.jupiter.api.Assumptions.assumingThat;
import org.junit.jupiter.api.Test;

/**
 * @author liyangyang
 * @date 2019/1/8
 */
class AssumptionsDemo {
    @Test
    void testAssumTrue() {
        System.out.println("test");
        //assumeTrue该语句并不会影响其前面的语句执行
        //可以将3>5改成3<5自行测试成功的效果
        assumeTrue(3>5);
        //该方法中下面所有的代码变为在上面假设的条件成立后执行
        // 如果上述假设不成立,则会忽略执行该行下面的代码,并报错
        System.out.println("assume is true!");
    }

    @Test
    void testAssumTrueMessage() {
        assumeTrue(3<5,
                //第二个参数为当第一个参数不成立时,输出的自定义错误信息
                () -> "Aborting test: not on developer workstation");
        //下面的代码变为在上面假设的条件成立后执行
        System.out.println("assume is true!");
    }
    
    @Test
    void testAssumeTrueLambda(){
        //这个方法的第一个参数为函数式接口,通过看起源码可以发现无参数,返回值为boolean
        assumeTrue(()->{
            System.out.println("in assumeTrue");
//            boolean flag = true;
            boolean flag = false;
            return flag;
        });
        System.out.println("out assumeTrue");
    }

    @Test
    void testAssumFalse(){
        //同assumTrue效果相反
        assumeFalse(3>5);
        System.out.println("assume is true!");
    }

    @Test
    void testAssumFalseMessage(){
        //同assumTrue效果相反
        assumeFalse(3<5,
                () -> "Aborting test: not on developer workstation");
        System.out.println("assume is true!");
    }

    @Test
    void testAssumThat() {
        assumingThat(3>5,
                () -> {
                    //与上述方法不同的是,仅当前面假设成立时,才会执行这里面的语句!!!!
                    // 且只会影响到该lambda表达式中的代码
                    assertEquals(2, 2);
                });
        //此处的断言不受上述assumingThat限制,在所有情况下都会执行
        System.out.println("no effect");
        assertEquals("a string", "a string");
    }
}

通过上述的案例,相信大家已经了解了Assumptions类的使用方法,下面我们来分析一下这个类。

源码分析

首先,我们看一下Assumptions类都有什么方法。

在这里插入图片描述
在这里插入图片描述

从图片中可以看到主要有5种方法:

  • 构造方法
  • 静态共有assumeFalse系列重载方法
  • 静态共有assumeTrue系列重载方法
  • 静态共有assumeThat系列重载方法
  • 静态私有throwTestAbortedException方法

其中的重载方法以assumeFalse为例说一下:

  • assumeFalse(boolean assumption) : 一个boolean类型参数假设表达式。
  • assumeFalse(BooleanSupplier assumptionSupplier) : 函数式接口参数BooleanSupplier无参一个boolean返回值,使用lambda表达式即可,上述案列中也有涉及此类方法的使用
  • assumeFalse(boolean assumption, String message) : 第一个参数假设表达式,第二个参数假设失败时自定义输出
  • assumeFalse(boolean assumption, Supplier messageSupplier) : 效果和assumeFalse(boolean assumption, String message)类似,只是将第二个自定义输出改成了函数式接口,可以使用lambda表达式,更加灵活。

ps:如果不知道什么是函数式接口或者lambda表达式,可以参考此博文:https://segmentfault.com/blog/yinhaonefu_java8

其中的作用在上述的案例分析中已经说明的很清楚了,接下来我们看一下其中的两个代表方法assumeTrue和assumeThat的源码是怎样的。

1.assumeTrue(boolean assumption, String message)源码:

代码语言:javascript
复制
public static void assumeTrue(boolean assumption, String message) throws TestAbortedException {
        if (!assumption) {
            //调用方法
            throwTestAbortedException(message);
        }

}
//被调用方法
private static void throwTestAbortedException(String message) {
        throw new TestAbortedException(StringUtils.isNotBlank(message) ? "Assumption failed: " + message : "Assumption failed");
}

从上述可以看到其代码过程为:

  1. 判断参数assumption是否为true,为true则成功执行
  2. 如果不为true,则调用throwTestAbortedException方法抛出一个自定义异常TestAbortedException

2.assumingThat(boolean assumption, Executable executable)方法源码分析:

代码语言:javascript
复制
public static void assumingThat(boolean assumption, Executable executable) {
        if (assumption) {
            try {
                executable.execute();
            } catch (Throwable var3) {
                ExceptionUtils.throwAsUncheckedException(var3);
            }
        }
}

从源码中就可以看出,只有当参数assumption为true时才会执行(executable.execute())第二个参数lambda表达式中的内容, 看一下第二个参数Executable的源码:

代码语言:javascript
复制
@FunctionalInterface
@API(
    status = Status.STABLE,
    since = "5.0"
)
public interface Executable {
    void execute() throws Throwable;
}

可以看到这里的Executable还是一个函数式接口(@FunctionalInterface),无参无返回值。只有一个execute()。

好了,到这里大家应该对Assumptions假设类有个全面的了解了,如果还是有疑问,可以自行根据源码并对照本博客进行理解。

如果转载此博文,请附上本文链接,谢谢合作~:https://blog.csdn.net/csdn___lyy

如果感觉这篇文章对您有所帮助,请点击一下“喜欢”或者“关注”博主,您的喜欢和关注将是我前进的最大动力!

refer: 官网

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年01月09日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • 案例解析
  • 源码分析
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档