Junit5系列-Junit5中Assumptions假设类

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/CSDN___LYY/article/details/86158807

系列导航

点击跳转到系列博文目录导航

简介

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

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

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

可以看下面一个案例:
在这里插入图片描述

案例解析

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

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

案例代码:

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)源码:

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)方法源码分析:

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的源码:

@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: 官网

展开阅读全文

没有更多推荐了,返回首页