SpringBoot2---单元测试(Junit5),蚂蚁金服内推四面

在这里插入图片描述


2、数组断言


通过 assertArrayEquals 方法来判断两个对象或原始类型的数组是否相等

是逻辑相等,也就是equals,不是地址相等,即==对于数组就是数组元素一致

@Test

@DisplayName(“array assertion”)

public void array() {

assertArrayEquals(new int[]{1, 2}, new int[] {1, 2},“数组内容不相等”);

}


3、组合断言


assertAll 方法接受多个 org.junit.jupiter.api.Executable 函数式接口的实例作为要验证的断言,可以通过 lambda 表达式很容易的提供这些断言

全部断言需要成功,才会执行下面的代码

@Test

@DisplayName(“assert all”)

public void all() {

assertAll(“Math”,

() -> assertEquals(2, 1 + 1),

() -> assertTrue(1 > 0)

);

}


4、异常断言


在JUnit4时期,想要测试方法的异常情况时,需要用@Rule注解的ExpectedException变量还是比较麻烦的。而JUnit5提供了一种新的断言方式Assertions.assertThrows() ,配合函数式编程就可以进行使用

第一个参数是预期出现的异常类型,第二个参数是Executable 接口,第三个参数是不符合第一个异常时抛出的信息

断定业务逻辑一定会出现异常,否则会抛出异常

@Test

@DisplayName(“异常测试”)

public void exceptionTest() {

ArithmeticException exception = Assertions.assertThrows(

//扔出断言异常

ArithmeticException.class, () -> System.out.println(1 % 0));

}


5、超时断言


Junit5还提供了Assertions.assertTimeout() 为测试方法设置了超时时间

@Test

@DisplayName(“超时测试”)

public void timeoutTest() {

//如果测试方法时间超过1s将会异常

Assertions.assertTimeout(Duration.ofMillis(1000), () -> Thread.sleep(500));

}


6、快速失败


通过 fail 方法直接使得测试失败

@Test

@DisplayName(“fail”)

public void shouldFail() {

fail(“This should fail”);

}


4、前置条件(assumptions)


JUnit 5 中的前置条件(assumptions【假设】)类似于断言,不同之处在于不满足的断言会使得测试方法失败,而不满足的前置条件只会使得测试方法的执行终止。前置条件可以看成是测试方法执行的前提,当该前提不满足时,就没有继续执行的必要。

和@disabled一样在测试报告中表现为skiped,注意和上面的包区分,这些方法都是assumptions下面的,上面是assertions下面的。

@DisplayName(“前置条件”)

public class Test {

private final String environment = “DEV”;

@org.junit.jupiter.api.Test

@DisplayName(“simple”)

public void simpleAssume() {

assumeTrue(Objects.equals(this.environment, “DEV1”),“两个字符串不相等”);

assumeFalse(() -> Objects.equals(this.environment, “PROD”));

}

@org.junit.jupiter.api.Test

@DisplayName(“assume then do”)

public void assumeThenDo() {

//如果假设成功了,要怎么办

assumingThat(

Objects.equals(this.environment, “DEV”),

() -> System.out.println(“In DEV”)

);

}

}

在这里插入图片描述

assumeTrue 和 assumFalse 确保给定的条件为 true 或 false,不满足条件会使得测试执行终止。assumingThat 的参数是表示条件的布尔值和对应的 Executable 接口的实现对象。只有条件满足时,Executable 对象才会被执行;当条件不满足时,测试执行并不会终止。


5、嵌套测试


JUnit 5 可以通过 Java 中的内部类和@Nested 注解实现嵌套测试,从而可以更好的把相关的测试方法组织在一起。在内部类中可以使用@BeforeEach 和@AfterEach 注解,而且嵌套的层次没有限制。

内层的test可以驱动外层的Before(After)Each/All之类的方法提前/之后运行,外层的不能驱动内层的Before(After)Each/All之类的方法

@DisplayName(“前置条件”)

public class Test

{

Stack stack;

@org.junit.jupiter.api.Test

@DisplayName(“is instantiated with new Stack()”)

void isInstantiatedWithNew() {

new Stack<>();

}

@Nested

@DisplayName(“when new”)

class WhenNew {

@BeforeEach

void createNewStack() {

stack = new Stack<>();

}

@org.junit.jupiter.api.Test

@DisplayName(“is empty”)

void isEmpty() {

assertTrue(stack.isEmpty());

}

@org.junit.jupiter.api.Test

@DisplayName(“throws EmptyStackException when popped”)

void throwsExceptionWhenPopped() {

assertThrows(EmptyStackException.class, stack::pop);

}

@org.junit.jupiter.api.Test

@DisplayName(“throws EmptyStackException when peeked”)

void throwsExceptionWhenPeeked() {

assertThrows(EmptyStackException.class, stack::peek);

}

@Nested

@DisplayName(“after pushing an element”)

class AfterPushing {

String anElement = “an element”;

@BeforeEach

void pushAnElement() {

stack.push(anElement);

}

@org.junit.jupiter.api.Test

@DisplayName(“it is no longer empty”)

void isNotEmpty() {

assertFalse(stack.isEmpty());

}

@org.junit.jupiter.api.Test

@DisplayName(“returns the element when popped and is empty”)

void returnElementWhenPopped() {

assertEquals(anElement, stack.pop());

assertTrue(stack.isEmpty());

}

@org.junit.jupiter.api.Test

@DisplayName(“returns the element when peeked but remains not empty”)

void returnElementWhenPeeked() {

assertEquals(anElement, stack.peek());

assertFalse(stack.isEmpty());

}

}

}

}


6、参数化测试


参数化测试是JUnit5很重要的一个新特性,它使得用不同的参数多次运行测试成为了可能,也为我们的单元测试带来许多便利。

利用@ValueSource等注解,指定入参,我们将可以使用不同的参数进行多次单元测试,而不需要每新增一个参数就新增一个单元测试,省去了很多冗余代码。

@ValueSource: 为参数化测试指定入参来源,支持八大基础类以及String类型,Class类型

@NullSource: 表示为参数化测试提供一个null的入参

@EnumSource: 表示为参数化测试提供一个枚举入参

@CsvFileSource:表示读取指定CSV文件内容作为参数化测试入参

@MethodSource:表示读取指定方法的返回值作为参数化测试入参(注意方法返回需要是一个流(Stream)并且必须是今静态方法)

当然如果参数化测试仅仅只能做到指定普通的入参还达不到让我觉得惊艳的地步。让我真正感到他的强大之处的地方在于他可以支持外部的各类入参。如:CSV,YML,JSON 文件甚至方法的返回值也可以作为入参。只需要去实现ArgumentsProvider接口,任何外部文件都可以作为它的入参。

@ParameterizedTest

@ValueSource(strings = {“one”, “two”, “three”})

@DisplayName(“参数化测试1”)

public void parameterizedTest1(String string) {

System.out.println(string);

Assertions.assertTrue(StringUtils.isNotBlank(string));

}

@ParameterizedTest

@MethodSource(“method”) //指定方法名

@DisplayName(“方法来源参数”)

public void testWithExplicitLocalMethodSource(String name) {

System.out.println(name);

Assertions.assertNotNull(name);

}

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

ull(name);

}

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-1SHPON35-1710891818652)]
[外链图片转存中…(img-8hcCJ9nw-1710891818653)]
[外链图片转存中…(img-GTik10NK-1710891818653)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-Y0WPCNpU-1710891818654)]

  • 13
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值