Springboot整合Junit5 常用注解

java1234

共 6196字,需浏览 13分钟

 ·

2021-03-15 09:26

点击上方蓝色字体,选择“标星公众号”

优质文章,第一时间送达

76套java从入门到精通实战课程分享

@Test

在Springboot2.0版本之后,Junit就是5.几的版本,在方法上添加@Test即可

@Test
void fun1(){
    int res = 1+1;
    Assertions.assertEquals(2,res);
    System.out.println(123);
}


@BeforeEach & @AfterEach

每执行一个@Test就会执行一次

 @BeforeEach
    void before(){
        System.out.println("before");
    }

    @AfterEach
    void after(){
        System.out.println("after");
    }

    @Test
    void fun1(){
        int res = 1+1;
        Assertions.assertEquals(2,res);
        System.out.println(123);
    }
    @Test
    void fun2(){

        System.out.println(456);
    }


@BeforeAll & @AfterAll

无论有多少个@Test都只执行一次,且@BeforeAll & AfterAll下的方法必须是静态方法

@BeforeAll
static void init(){
    System.out.println("init");
}

@AfterAll
static void destory(){
    System.out.println("destory");
}

@BeforeEach
void before(){
    System.out.println("before");
}

@AfterEach
void after(){
    System.out.println("after");
}

@Test
void fun1(){
    int res = 1+1;
    Assertions.assertEquals(2,res);
    System.out.println(123);
}
@Test
void fun2(){

    System.out.println(456);
}

@SpringBootTest

在SpringBoot项目中,我们在测试类中new 一个类时,这个类可能同时会涉及到其他的Bean,而原来的@Test并不会涉及到Springboot的上下文,所以我们在SpringBoot项目中编写测试类时,会在类上添加@SpringBootTest,细心的小伙伴会发现在我们创建项目选择 Spring Initializr创建SpringBoot项目时,目录下会有一个Test文件,就会看到自动创建好的Test类上带有@SpringBootTest


同时也能配合@Autowired的注入

@SpringBootTest  //能够初始化springboot的上下文,防止new Serv01 的对象同时依赖其他的Bean
public class Test2 {

    @Autowired
    Serv01 serv01;

    @Test
    void t1(){
        int add = serv01.add(1, 1);
        Assertions.assertEquals(2,add);
        System.out.println(11);

    }
}


当然,运行这个带@SpringBootTest的测试用例,也会启动我们的SpringBoot项目


@MockBean

通过mock来做到一个模拟,假如我们的测试需要写入数据库,可能会造成一些不可挽回的操作


我们对这些危险的操作会使用mock来进行一个模拟


我们来看下面的代码

@SpringBootTest  //能够初始化springboot的上下文,防止new Serv01 的对象同时依赖其他的Bean
public class Test2 {

    @MockBean
    Serv01 serv01;

    @Test
    void t1(){
        int add = serv01.add(1, 1);
        Assertions.assertEquals(2,add);
        System.out.println(11);

    }
}

通过断点得知 变量add 竟然等于0


原因就是我们在SpringBoot上下文的serv01的这个bean已经被我们的mock替换掉了,因为我们的mock并没有任何指定操作,所以我们的int变量add 只会有默认值 0


我们对mock添加一些指定操作

@SpringBootTest
public class Test2 {

    @MockBean
    Serv01 serv01;

    @Test
    void t1(){
        when(serv01.add(1,1)).thenReturn(3);
        int add = serv01.add(1, 1);
        Assertions.assertEquals(2,add);
        System.out.println(11);

    }
}




我们再次修改代码,在Serv01添加sub的方法,然后运行测试



我们可以发现在我们指定规则的add方法,得出的结果是3,而未指定规则的sub方式则默认int变量为0


如果说我们想让sub按照原来的方式进行测试,不想被@MockBean影响,我们可以使用@SpyBean


@SpyBean

是介于@MockBean和@Autowired之间,在配置了规则的方法就按配置规则的执行,没有配置的就按原来的方法执行测试



如果我们在创建一个serv02,让serv01调用serv02的方法,运行的结果还是一样吗?

@Service
public class Serv02 {
    int add2(int a, int b){
        return a+b;
    }
}

@Service
public class Serv01 {

    @Autowired
    Serv02 serv02;

    public int add(int a,int b){
        return serv02.add2(a,b);
    }

    public int sub(int a,int b){
        return a-b;
    }
}

@SpringBootTest  //能够初始化springboot的上下文,防止new Serv01 的对象同时依赖其他的Bean
public class Test2 {

    @SpyBean
    Serv01 serv01;

    @MockBean
    Serv02 serv02;

    @Test
    void t1(){
        when(serv01.add(1,1)).thenReturn(3);
        int add = serv01.add(1, 1);
        int sub = serv01.sub(2,1);
        Assertions.assertEquals(3,add);
        Assertions.assertEquals(1,sub);
        System.out.println(11);

    }
}


运行成功,即使我们mock的是serv02,通过serv01调用的add方法调用serv02的add2方法,照样运行成功!


最后按照测试规范,我们一般一个类对应一个test,但也可能出现一个类对应多个test,因为可能出现test调用多个类的情况!

————————————————

版权声明:本文为CSDN博主「小爽帅到拖网速」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:

https://blog.csdn.net/weixin_46195957/article/details/114273530




锋哥最新SpringCloud分布式电商秒杀课程发布

👇👇👇

👆长按上方微信二维码 2 秒





感谢点赞支持下哈 

浏览 34
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报