当前位置: 首页 > 后端技术 > Java

mockito简介

时间:2023-04-02 00:28:13 Java

前言最近在项目中跑单元测试的时候,发现直接使用springboot自带的测试,跑一整套要几十分钟,实在受不了。考虑到功能的特殊性,想到了Spring测试包本身。有了mockito单元测试,所以第一次尝试使用它。测试代码pom包>org.mockitomockito-inline4.5.1test导入o??rg.springframework.beans.factory.annotation.Autowired;导入org.springframework.stereotype.Service;/***@authorSteven*@Date2023/1/3015:45*/@ServicepublicclassOrderA{@AutowiredprivateOrderCorderC;publicintprint(){System.out.println("D="+OrderD.getResult());System.out.println(orderC.print(2));System.out.println("你好世界");返回-1;}}导入o??rg.springframework.beans.factory.annotation.Autowired;导入org.springframework.stereotype.Service;/***@authorSteven*@Date2023/1/3015:46*/@ServicepublicclassOrderB{@AutowiredprivateOrderA订单;publicbooleantest(){System.out.println("订单Btest()");System.out.println("订单价值="+order.print());System.out.println("订单Bhelloworld");返回真;}}导入o??rg.springframework.stereotype.Service;/***@authorSteven*@Date2023/1/3016:43*/@ServicepublicclassOrderC{publicintprint(inta){System.out.println("hello"+a);返回-1;}}导入o??rg.springframework.beans.factory.annotation.Autowired;导入org.springframework.stereotype.Component;/***@authorSteven*@Date2023/1/3017:32*/@ComponentpublicclassOrderD{privatestaticOrderCorderC;@AutowiredpublicOrderD(OrderCorderCa){System.out.println("==================");orderC=orderCa;}publicstaticintgetResult(){System.out.println("hhhhh===="+OrderE.print());返回orderC.print(3);}}/***@authorSteven*@Date2023/1/3114:04*/publicclassOrderE{publicstaticintprint(){System.out.println("ahhahahahahhaha");返回1111111;}}主要测试类importcom.timelinecapital.web.service.order.*;导入org.checkerframework.checker.units.qual.A;导入org.junit.jupiter.api.Assertions;导入org.junit.jupiter.api.Test;导入org.junit.jupiter.api.extension.ExtendWith;导入org.mockito.MockedStatic;导入org.mockito.Mockito;导入org.springframework.beans.factory.annotation.Autowired;导入org.springframework.boot.test.mock.mockito.MockBean;导入org.springframework.test.context.ContextConfiguration;导入org.springframework.test.context.junit.jupiter.SpringExtension;导入静态org.mockito.ArgumentMatchers.anyInt;导入静态org.mockito.BDDMockito.then;导入静态org.mockito.Mockito.when;/***@authorSteven*@Date2023/1/3015:48*/@ContextConfiguration(classes={OrderB.class,OrderA.class,OrderC.class,OrderD.class})@ExtendWith(SpringExtension.class)公共类OrderTest{@AutowiredprivateOrderBorderB;@MockBeanprivateOrderCorderC;@TestpublicvoidtestOrder()throwsException{Mockito.mockStatic(OrderE.class);//尝试(MockedStaticorderEMockedStatic=Mockito.mockStatic(OrderE.class)){when(OrderE.print()).thenReturn(333);//orderEMockedStatic.close();//}//when(orderA.print()).thenReturn(100);//when(orderC.print(anyInt())).thenReturn(101);when(orderC.print(anyInt())).thenReturn(201);布尔res=orderB.test();断言.assertTrue(res);}}测试代码说明:@ExtendWith(SpringExtension.class)这个注解主要是继承spring环境@ContextConfiguration这个注解主要是-classes属性主要是导入springbeans。如果没有配置需要导入的bean,会报依赖注入异常。默认情况下,需要手动配置需要注入bean的相关类。否则会报错,找不到依赖注入异常。beanCausedby:org.springframework.beans.factory.UnsatisfiedDependencyException:Errorcreatingbeanwithname'orderB':Unsatisfieddependencyexpressedthroughfield'order';嵌套异常是org.springframework.beans.factory.NoSuchBeanDefinitionExceptionofException:'com.timelinecapital.web.service.order.OrderA'available:expectedatleast1beanwhichqualifiedasautowirecandidate.依赖注解:{@org.springframework.beans.factory.annotation.Autowired(required=true)}在org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:659)在org.springframenotAnnotationBeanPostProcessor.beans.factory$AutowiredFieldElement(AutowiredAnnotationBeanPostProcessor.java:639)atorg.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119)有时你需要模拟静态方法,只需使用Mockito.mockStatic(OrderE.class);一个错误会是报错,需要导入mockito-inline包。具体原因后续分析都是常见的错误异常。这个错误异常非常友好,提示如何操作:org.mockito.exceptions.base.MockitoException:TheusedMockMakerSubclassByteBuddyMockMakerdoesnotsupportthecreationofstaticmocksMockito'sinlinemockmakersupportsstaticmocksbasedontheInstrumentationAPI.您可以通过放置“mockito-inline”工件来简单地启用此模拟模式您当前正在使用“mockito-core”的地方。请注意,Android不支持Mockito的内联模拟生成器。综上所述,默认情况下需要手动配置所有对应的需要注入的bean。需要配置。如果不配置注入,会报错。注入或模拟。例如,OrderB依赖于OrderA和静态OrderD类。OrderA的bean要么被mock,要么被注入,而OrderD不一样,因为它是静态的,但是导入的时候需要注入orderC,所以从Spring的角度来说,是需要注入的。当然也可以一开始就嘲讽。当一个实例被模拟时,它就变成了虚拟的,并且不需要注入它的依赖项。从项目的角度来说,项目越大,不可能针对某一个功能跑一个服务,因为服务还有其他的功能,所以功能测试就成了一个很好的解决方案,可以随意mock,返回想要的值,Best覆盖所有测试,唯一的缺点是您需要处理所有依赖注入。参考使用Mockito模拟Static静态方法https://blog.csdn.net/qq_3864...