Junit5详解

Junit5是当前最新的测试框架。在junit5当中,一些之前使用的注解和测试方法被新的注解替换掉了。 使用junit5的测试结构如下:

import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
 
import com.howtodoinjava.junit5.examples.Calculator;
 
public class AppTest {
     
    @BeforeAll
    static void setup(){
        System.out.println("@BeforeAll executed");
    }
     
    @BeforeEach
    void setupThis(){
        System.out.println("@BeforeEach executed");
    }
     
    @Tag("DEV")
    @Test
    void testCalcOne() 
    {
        System.out.println("======TEST ONE EXECUTED=======");
        Assertions.assertEquals( 4 , Calculator.add(2, 2));
    }
     
    @Tag("PROD")
    @Disabled
    @Test
    void testCalcTwo() 
    {
        System.out.println("======TEST TWO EXECUTED=======");
        Assertions.assertEquals( 6 , Calculator.add(2, 4));
    }
     
    @AfterEach
    void tearThis(){
        System.out.println("@AfterEach executed");
    }
     
    @AfterAll
    static void tear(){
        System.out.println("@AfterAll executed");
    }
}

主要有下面这些注解:@BeforeAll, @BeforeEach, @AfterAll, @AfterEach

@BeforeAll

JUnit 5 @BeforeAll注释是JUnit 4中@BeforeClass注释的替代。它用于表示应在当前测试类中的所有测试方法之前执行的带的方法。

@BeforeAll注释的方法必须是静态方法,否则会报运行时错误。

@BeforeEach

JUnit 5 @BeforeEach注释替代了JUnit 4中的@Before注释。被注释的方法会在当前类中的每个Test方法之前执行。也就是说有多少个test这个方法就会执行多少次

@BeforeEach注释的方法一定不能是静态方法,否则会报发运行时错误。

@AfterEach

JUnit 5 @AfterEach注释是JUnit 4中@After注释的替换。它用于表示应在当前类中的每个@Test方法之后执行带注释的方法。

@AfterAll

JUnit 5 @AfterAll注释是JUnit 4中@AfterClass注释的替换。它用于表示应在当前测试类中的所有测试之后执行带注释的方法。

@AfterAll注释的方法必须是静态方法,否则会报运行时错误。

junit5当中使用 @BeforeEach 替换了 @Before 使用 @AfterEach替换了 @After

@BeforeAll和@AfterAll用于非static方法的场景

在写测试尤其是基于spring boot的integration test的时候,我们常常需要通过注入的方式来初始化一些对象,当我们又想把这些对象在测试之前初始化时,就会发现对于注入的对象,只能将其放在非static的方法当中,根本原因在于spring的依赖注入实现原理。

但是将@beforeAll和@AfterAll放在非static方法上的时候却会报错。

为此,我们可以使用@TestInstance注解配置测试的生命周期。 如果我们不在测试类中声明它,则默认情况下,生命周期模式将为PER_METHOD。 因此,为了防止我们的测试类抛出JUnitException,我们可以使用@TestInstance(TestInstance.Lifecycle.PER_CLASS)对其进行注释。

例如:

@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class BeforeAndAfterAnnotationsUnitTest {
 
    String input;
    Long result;
 
    @BeforeAll
    public void setup() {
        input = "77";
    }
 
    @AfterAll
    public void teardown() {
        input = null;
        result = null;
    }
 
    @Test
    public void whenConvertStringToLong_thenResultShouldBeLong() {
        result = Long.valueOf(input);
        Assertions.assertEquals(77l, result);
    }
}

这样我们的测试就可以运行成功了。

@Disabled可以用于不运行某些test的场景。@Tag可以用于将测试分类。在这里不做展开

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值