在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为例说一下:
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");
}
从上述可以看到其代码过程为:
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: 官网