这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
《JUnit5学习》系列旨在通过实战提升SpringBoot环境下的单元测试技能,一共八篇文章,链接如下:
本文是《JUnit5学习》系列的第二篇,学习一个重要的知识点:Assumptions类,只有了解了它们,才好继续后面的学习,全篇章节如下:
名称 | 链接 | 备注 |
---|---|---|
项目主页 | https://github.com/zq2599/blog_demos | 该项目在GitHub上的主页 |
git仓库地址(https) | https://github.com/zq2599/blog_demos.git | 该项目源码的仓库地址,https协议 |
git仓库地址(ssh) | git@github.com:zq2599/blog_demos.git | 该项目源码的仓库地址,ssh协议 |
Assumptions和Assertions容易混淆,因此这里通过对比它们来学习:
package com.bolingcavalry.assertassume.service.impl;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assumptions.assumeTrue;
@SpringBootTest
@Slf4j
public class AssertAssumpTest {
/**
* 最简单的成功用例
*/
@Test
void assertSuccess() {
assertEquals(2, Math.addExact(1,1));
}
/**
* 最简单的失败用例
*/
@Test
void assertFail() {
assertEquals(3, Math.addExact(1,1));
}
/**
* assumeTrue不抛出异常的用例
*/
@Test
void assumpSuccess() {
// assumeTrue方法的入参如果为true,就不会抛出异常,后面的代码才会继续执行
assumeTrue(true);
// 如果打印出此日志,证明assumeTrue方法没有抛出异常
log.info("assumpSuccess的assumeTrue执行完成");
// 接下来是常规的单元测试逻辑
assertEquals(2, Math.addExact(1,1));
}
/**
* assumeTrue抛出异常的用例
*/
@Test
void assumpFail() {
// assumeTrue方法的入参如果为false,就会抛出TestAbortedException异常,后面就不会执行了
assumeTrue(false, "未通过assumeTrue");
// 如果打印出此日志,证明assumpFail方法没有抛出异常
log.info("assumpFail的assumeTrue执行完成");
// 接下来是常规的单元测试逻辑,但因为前面抛出了异常,就不再执行了
assertEquals(2, Math.addExact(1,1));
}
}
弄清楚的Assertions和Assumptions的区别,接下来趁热打铁,学习Assumptions类中几个重要的静态方法:assumeTrue、assumingThat
@Test
@DisplayName("最普通的assume用法")
void tryAssumeTrue() {
assumeTrue("CI".equals(envType));
log.info("CI环境才会打印的assumeTrue");
}
@Test
@DisplayName("assume失败时带自定义错误信息")
void tryAssumeTrueWithMessage() {
// 第二个入参是Supplier实现,返回的内容用作跳过用例时的提示信息
assumeTrue("CI".equals(envType),
() -> "环境不匹配而跳过,当前环境:" + envType);
log.info("CI环境才会打印的tryAssumeTrueWithMessage");
}
效果如下图:
3. 还有个assumingThat方法,可以接受Executable类型作为第二个入参,如果第一个入参为true就会执行Executable的execute方法,注意assumingThat方法的特点:不抛出异常,因此其所在的方法不会被跳过,这是和assumeTrue相比最大的区别(assumeTrue一旦入参为false就会抛出异常,其所在方法就被标记为跳过):
@Test
@DisplayName("assume成功时执行指定逻辑")
void tryAssumingThat() {
// 第二个入参是Executable实现,
// 当第一个参数为true时,执行第二个参数的execute方法
assumingThat("CI".equals(envType),
() -> {
log.info("这一行内容只有在CI环境才会打印");
});
log.info("无论什么环境都会打印的tryAssumingThat");
}
envType:CI
envType:PRODUCTION
package com.bolingcavalry.assertassume.service.impl;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import static org.junit.jupiter.api.Assumptions.assumeTrue;
import static org.junit.jupiter.api.Assumptions.assumingThat;
@SpringBootTest
@Slf4j
@ActiveProfiles("test")
public class AssumptionsTest {
@Value("${envType}")
private String envType;
@Test
@DisplayName("最普通的assume用法")
void tryAssumeTrue() {
assumeTrue("CI".equals(envType));
log.info("CI环境才会打印的assumeTrue");
}
@Test
@DisplayName("assume失败时带自定义错误信息")
void tryAssumeTrueWithMessage() {
// 第二个入参是Supplier实现,返回的内容用作跳过用例时的提示信息
assumeTrue("CI".equals(envType),
() -> "环境不匹配而跳过,当前环境:" + envType);
log.info("CI环境才会打印的tryAssumeTrueWithMessage");
}
@Test
@DisplayName("assume成功时执行指定逻辑")
void tryAssumingThat() {
// 第二个入参是Executable实现,
// 当第一个参数为true时,执行第二个参数的execute方法
assumingThat("CI".equals(envType),
() -> {
log.info("这一行内容只有在CI环境才会打印");
});
log.info("无论什么环境都会打印的tryAssumingThat");
}
}