美文网首页
Springboot 整合 Junit5 常用注解

Springboot 整合 Junit5 常用注解

作者: hemiao3000 | 来源:发表于2021-03-10 09:56 被阅读0次

    @Test

    在 Springboot2.0 版本之后,Junit 就是 5.x 的版本,在方法上添加 @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 Initializer 创建 SperingBoot 项目时,目录下会有一个 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(){
            Mockito.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(){
            Mockito.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调用多个类的情况!

    相关文章

      网友评论

          本文标题:Springboot 整合 Junit5 常用注解

          本文链接:https://www.haomeiwen.com/subject/cctwqltx.html