本篇文章给大家谈谈单元测试mock工具类,以及单元测试工具类别有哪些对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
今天给各位分享单元测试mock工具类的知识,其中也会对单元测试工具类别有哪些进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
python单元测试--mock
使用mock
单元测试mock工具类,可以将某个函数所依赖
单元测试mock工具类的对象或者变量mock掉
单元测试mock工具类,从而降低测试条件的负责度。如下所示
单元测试mock工具类:
上述是mock对象的简单使用方法,通过实例化一个Mock对象从而模拟掉原始函数的返回值,高级一些的用法就是通过mock.patch装饰器,装饰在类或者函数上进行模拟测试,如下在test.py文件中有两个类:
测试用例设计如下:
以上测试用例说明,通过patch装饰器模拟了 test.ProductionClass1 这个类,在 test_01 中使用 mock_class 模拟 test.ProductionClass1 。首先通过 mock_class.return_value 获取类实例(如果模拟的是函数,则不需要这一步),然后通过 obj1.pro1_method.return_value 设置方法的返回值,并进行测试。测试结果说明无论是通过 mock_class 还是 test.ProductionClass1 还是 obj1 执行方法,获取到的结果都是设置的值,并且在另一个类中调用模拟类的方法,也能成功获取到设置的 return_value 。
mock单元测试 mockito实践
@Rule
public MokitoRule rule = MockitoJUnit.rule();
注意这里的修饰符public,如果没有这个修饰符的话使用mock测试会报错
@Rule
public ExpectedException thrown = ExpectedException.none();
可以选择忽视抛出的异常?(我是这么理解的不知道是否正确)
这里我还没有看juint执行的逻辑,只是看了mock环境下获取注解创建mock对象,并将mock的对向注入到@Injectmocks的目标测试对象中去的逻辑。
使用的jar包版本是junit.junit.4.11,org.powermock.powermock-api-mockito.1.6.6
创建一个interface用于目标测试类的filed的type。
创建一个目标测试类,其中声明filed的type为上面的interface的type
最后创建一个测试用例对象用于测试目标测试类
我从rule对象执行的时候开始追踪,junit的运行原理略过
其中的testClass就是测试用例,MyMockTest的实例,annotationEngine是默认的注解驱动InjectingAnnotationEngine,
这个方法的内部获取测试用例的type,获取注解驱动,并判断是否是默认的注解驱动,可以自定义注解驱动?(暂时我还办不到),之后注解驱动执行
InjectingAnnotationEngine.process 内部只有两个方法,从名字和其上的注释可以知道
processIndependentAnnotations处理独立的filed,其实就是测试用例中有@mock注解的filed,这里就是a和b。processInjectMocks处理依赖于独立mock对象的filed,就是测试用例中有@InjectMocks注解的filed,依赖于mock对象的目标测试类,这里就是DoMainObject,先看processInjectMocks
入参分别为测试用例的type,和instance,方法中只有一个循环,在循环的内部处理三件事
1delegate.process(classContext, testInstance);委派对象处理@Mock,@Captor等注解,
2spyAnnotationEngine.process(classContext, testInstance);监视注解驱动处理@Spy注解
3获取测试用例的父类,赋值给原来的变量
4如果Class的type为Object,跳出循环
这个方法就是先处理自己的独立注解,然后去处理父类的独立注解,如此往复直到父类为Object源类。
这个方法参数还是Class的type和Class 的instance,
处理过程是获取instance的所有field就是所有的属性,然后循环获取filed的上的所有注解,更具注解和field尝试创建mock对象,这里最后的创建对象时使用cblib创建代理对象,最后创建一个Setter对象将创建的cglib代理对象mock对象,set进instance的field中去,即完成了一个测试用例中的属性的注入(spring的bean注解注入方式是不是也是如此呢,所有的基于注解的实现原理是否基本类似于此呢)
这里只关注两个方法createMockFor和FieldSetter(testInstance, field).set(mock)
createMockFor方法的流程比较复杂,
这个方法的内部有两个方法,
在这个方法中对annotationd的类型与已有的注解处理器对象集合进行判断是否包含,如果包含取出对应的处理器对象,如果不包含空实现一个注解处理器实现process方法返回为null。也就是说在DefaultAnnotationEngine对象的实例中只处理特定的注解生成其mock代理对象。
这个注解处理器的集合是在4中创建了deletage时创建了DefaultAnnotationEngine对象,然后在其构造方法中调用了注册注解驱动方法
private final Map, FieldAnnotationProcessor? annotationProcessorMap = new HashMap, FieldAnnotationProcessor();
根据获取的annotationProcess对象执行process方法,如果不是从map中获取的那么返回值就是null,在本测试中就是@mock的方法返回了MockAnnotationProcessor类型的注解驱动,
Mockito.mock(field.getType(), mockSettings);这个就是最后创建mock的cglib代理对象的方法,对这个方法暂时就不继续追踪了,
现在我们已经将一个@Mock注解下的测试类中的field建立好了,让我们回到5的process方法中,能看见这个步骤就是重复的执行这段逻辑:
获取field的所有注解,调用createMockFor方法,然后在此方法中和DefaultAnnotationEngine预置的FieldAnnotationProcessor 实现类型集合做匹配,满足的获取指定的注解处理器创建对应的mock对象。不满足的创建一个匿名子类,其中实现的方法指定返回null。以此将@Mock等注解和其他注解区分开来,只创建@Mock和@Captor等独立的注解。如此步骤processIndependentAnnotations.process()就完成了。
spyAnnotationEngine.process的执行类似,但是这个注解处理类是使用反射去根据类型创建一个真实的实例对象返回而不是创建一个mock的cglib对象。
现在我们完成了processIndependentAnnotations,来看看现在的测试用例instance
可以看到现在a,b使用@Mock注解的field已经存在cglib的代理对象了,使用@InjectMocks的doMainObject暂时还是null,现在来看processInjectMocks
方法内部的核心方法是injectMocks,内部的逻辑从子类到父类最后到Object处理每个继承层级的@InjectMocks注解
方法内处理
1获取测试用例的Class类型
2创建一个Field对象的set集合
3循环处理
4将class中所有InjectMocks注解的field放到mockDependentFields集合中
5将创建的mock对象添加到mocks集合中
6Class类型是Object跳出循环
7创建@InjectMock注解修饰的field
这是根据依赖创建目标测试类的mock对象。
最后方法完成的时候
可以看到目标测试类创建完成,依赖a,b也已经注入。
没有去追踪Junit和cglib只是将中间mock的注解的过程进行了追踪:
基本就是先创建mock对象,然后将根据依赖创建@InjectMocks的目标测试类对象
其中注解的区分
1@InjectMocks和其他类型不同,
2@Spy和@Mock,@Captor等注解不同
在使用的过程中Rule一定要是pulic修饰的
在使用mockito的时候还出现了mock的对象在测试的时候报空指针的问题,我追踪后发现是同类型的interface在注入@InjectMocks修饰的主目标对象的时候是有排序的,会根据测试类中的filedName进行排序依次向下注入,解决办法就是把@InjectMocks的所有field都进行mock。
在SpringBoot中编写Mock单元测试
在IDEA中写好的类中
单元测试mock工具类,右建GO TO
单元测试mock工具类,选择TEST
单元测试mock工具类,如果没有对应的单元测试类就选择创建。
在创建该类的单元测试类前,先讲一下这几个基本注解:
@Test:使用该注解标注的public void方法会表示为一个测试方法
单元测试mock工具类;
@BeforeClass:表示在类中的任意public static void方法执行之前执行;
@AfterClass:表示在类中的任意public static void方法之后执行;
@Before:表示在任意使用@Test注解标注的public void方法执行之前执行;
@After:表示在任意使用@Test注解标注的public void方法执行之后执行;
新建的springBoot项目中默认包含
单元测试mock工具类了spring-boot-starter-test的依赖,如果没有包含可自行在pom.xml中添加依赖。
所谓的mock就是创建一个类的虚假的对象,在测试环境中,用来替换掉真实的对象,以达到两大目的:
使用Mock之前,需要在@Before或@BeforeClass对应的方法中添加如下,表示添加mock注解初始化。
另外需要补充以下几个常用的测试注解:
Mockito中的Mock和Spy都可用于拦截那些尚未实现或不期望被真实调用的对象和方法,并为其设置自定义行为。二者的区别在于Mock不真实调用,Spy会真实调用。
(1)被测试类
(2)测试类
(1)被测试类
(2)测试类
Mockito的使用,一般有以下几种组合: 参考链接
Mockito 有多种匹配函数,部分如下:
单元测试如何Mock final类
在Mockito的旧版本中,是无法mock被final修饰的类或者方法的。强行mock会报如下错误:
在新版本中Mockito可以通过追加配置的方式实现final类的mock,实现如下:
在src/test/resources下追加文件:
优雅单测-3用Mockito轻松解决复杂的依赖问题
Mockito是GitHub上用于Java使用最广泛的Mock框架
Mockito核心解决的问题:不管是测试驱动开发,还是系统架构本身,都会带来的依赖结构复杂问题;单元测试做软件中的最小可测试单元,只应依当前单元的配置。 所有较大的系统都会有依赖复杂的问题。 此类问题就需要Mock框架来解决
使用很简单一般分3部:
@MockBean,在SpringBoot中通过@MockBean注解,就可以快速装在一个Mock的Bean了。
此方式通过非常简单的方式解决了系统层级之间单测的依赖,可以用在数据层和业务层,也可以用在业务层之间的多项依赖等依赖上的问题
直接执行:
可以看到如果使用了SpringBoot,并且使用@MockBean可以快速解决依赖的问题。但是,Mock出的LiveReportMapper对象其实是个空壳,那么既然是mock就要知道如何通过mock的方式解决各种复杂逻辑
下面模拟2种复杂逻辑,Service层的单元测试mock依赖的另外一个Service类"InfoService" ,并且mock里面的2个方法
下面看例子:
如果没有SpringBoot环境的Starter,可以直接使用Mockito。 除了@MockBean不能使用其他功能不受影响,参考上面例子
更多用法参考Mockito官方文档,此处不做赘述
官网地址: https://site.mockito.org/
Mock测试
SpringMVC单元测试
单元测试mock工具类的独立测试
单元测试mock工具类;对模块进行集成测试时
单元测试mock工具类,希望能够通过输入URL对Controller进行测试
单元测试mock工具类,如果通过启动服务器,建立http client进行测试,这样会使得测试变得很麻烦,比如,启动速度慢,测试验证不方便,依赖网络环境等,所以为了可以对Controller进行测试,我们引入MockMVC。
MockMvc实现了对Http请求的模拟,能够直接使用网络的形式,转换到Controller的调用,这样可以使得测试速度快、不依赖网络环境,而且提供了一套验证的工具,这样可以使得请求的验证统一而且很方便。
★ 服务器端SpringMVC测试的主入口点。
★ 通过MockMVCBuilders建造者的静态方法去建造MockMVCBuilder,MockMvc由MockMVCBuilder构造。
★ 核心方法:perform(RequestBuilder rb),执行一个RequestBuilder请,会自动执行SpringMVC的流程并映射到相应的控制器执行处理,该方法的返回值是一个ResultActions
★ MockMVCBuilder是使用构造者模式来构造MockMvc的构造器。
★ 主要有两个实现:StandaloneMockMvcBuilder和DefaultMockMvcBuilder。
★ 可以直接使用静态工厂MockMvcBuilders创建即可,不需要直接使用上面两个实现类。
★ 负责创建MockMVCBuilder对象。
两种创建方式
★ 用来构建Request请求的,其主要有两个子类。
★ MockHttpServletRequestBuilder和MockMultipartHttpServletRequestBuilder(如文件上传使用),即用来Mock客户端请求需要的所有数据。
★ MockMvc.perform后将得到ResultActions
★ andExpect:添加ResultMatcher验证规则,验证控制器执行完成后结果是否正确。
★ andDo:添加ResultHandler结果处理器,如调试时打印结果到控制台。
★ andReturn:最后返回相应的MvcResult;然后进行自定义验证或下一步的异步处理。
★ MockMvcResultMatchers
用来匹配执行完请求后的**结果验证。
果匹配失败将抛出相应的异常。
包含了很多验证API方法。
★ MockMvcResultHandlers 结果处理器,表示要对结果做处理的需要用到。
关于单元测试mock工具类和单元测试工具类别有哪些的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
单元测试mock工具类的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于单元测试工具类别有哪些、单元测试mock工具类的信息别忘了在本站进行查找喔。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
暂时没有评论,来抢沙发吧~