当前位置: 首页 > news >正文

cn域名知名网站服装外贸流程

cn域名知名网站,服装外贸流程,高质量外链平台,php网页期末大作业目录 一、简介1.1 单元测试的特点1.2 Mock类框架的使用场景1.3 常见的Mock框架1.3.1 Mockito1.3.2 EasyMock1.3.3 PowerMock1.3.4 Testable1.3.5 比较 二、Mockito的使用2.1 导入pom文件2.2 mock对象和spy对象2.3 初始化mock/spy对象的方式2.4 参数匹配2.5 方法插桩2.6 InjectM… 目录 一、简介1.1 单元测试的特点1.2 Mock类框架的使用场景1.3 常见的Mock框架1.3.1 Mockito1.3.2 EasyMock1.3.3 PowerMock1.3.4 Testable1.3.5 比较 二、Mockito的使用2.1 导入pom文件2.2 mock对象和spy对象2.3 初始化mock/spy对象的方式2.4 参数匹配2.5 方法插桩2.6 InjectMocks注解的使用2.7 断言工具 一、简介 1.1 单元测试的特点 配合断言使用杜绝System.out可重复执行不依赖环境不会对数据产生影响Spring的上下文环境不是必须得一般都需要配合Mock类框架来实现的 1.2 Mock类框架的使用场景 要进行测试的方法存在外部依赖如数据库Redis第三方接口调用等为了能够专注对该方法或者单元的逻辑进行测试就希望能够虚拟出外部依赖避免外部依赖成为测试的阻塞项。 1.3 常见的Mock框架 Mock类框架用于Mock外部依赖。 1.3.1 Mockito 官网http://mockito.org/ 官网文档https://www.javadoc.io/doc/org.mockito/mockito-core/4.5.1/org/mockito/Mockito.html#13 限制老版本对于final class、final method、statis method、private method均不能对Mockito mock目前新版本已经支持final class、final method、statis method方法的mock具体可以参考官网有空了再补 1.3.2 EasyMock 1.3.3 PowerMock 文档https://github.com/powermock/powermock/wiki/Getting-Started PowerMock是一款功能十分强大的Mock工具其基本语法与Mockito兼容同时扩展了许多Mockito缺失的功能包括对支持对私有、静态和构造方法实施Mock。但由于使用了自定义类加载器会导致Jacoco在默认的on-the-fly模式下覆盖率跌零。 powerMock是基于easyMock或Mockito扩展出来的增强版本所以powerMock分两种类型如果你习惯于使用easyMock的那你就下载基于easyMock的powerMock反之你喜欢用mockito的话就下载另一种PowerMock。 但是好像也没有多少人用。。。 1.3.4 Testable 文档https://alibaba.github.io/testable-mock/#/ TestableMock现在已不仅是一款轻量易上手的单元测试Mock工具更是以简化Java单元测试为目标的综合辅助工具集与PowerMock基本平齐且极易上手只需掌握一个MockInvoke注解就可以完成绝大多数Mock操作。 1.3.5 比较 工具原理最小Mock单元对被Mock方法的限制上手难度IDE支持Mockito动态代理类不能Mock私有方法较容易很好PowerMock自定义类加载器类任何方法皆可较复杂较好JMockit运行时字节码修改类不能Mock构造方法(new操作符)较复杂一般TestableMock运行时字节码修改方法任何方法皆可较容易较好 二、Mockito的使用 2.1 导入pom文件 导入Mockito坐标和junit5的坐标 dependencygroupIdorg.junit.jupiter/groupIdartifactIdjunit-jupiter/artifactIdversion5.7.0/versionscopecompile/scope/dependencydependencygroupIdorg.mockito/groupIdartifactIdmockito-core/artifactIdversion3.6.28/versionscopecompile/scope/dependency导入Mockito坐标和junit5的坐标前期工作已经完成。 如果在springboot中我们还可以直接引用下面的坐标即可其中的依赖已经包含了上述两者。 !-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-test -- dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdversion3.0.13/versionscopetest/scope /dependency2.2 mock对象和spy对象 方法类型方法插桩方法不插桩作用对象最佳实践mock对象执行插桩逻辑返回mock对象的默认值类、接口被测试类或者其他依赖spy对象执行插桩逻辑调用真实方法类、接口被测试类 Mock不是真实的对象它只是用类型的class创建了一个虚拟对象并可以设置对象行为Spy是一个真实的对象但它可以设置对象行为 2.3 初始化mock/spy对象的方式 测试版本方法一方法二方法三junit4RunWith(MockitoJUnitRunner.class) Mock等注解MockitoAnnotations.initMocks(this);Mockito.mock(x.class)junit5ExtendWith(MockitoExtension.class) Mock等注解MockitoAnnotations.initMocks(this);Mockito.mock(x.class) MockitoAnnotations.initMocks(this)方法已经被openMocks(this)替代。 我们现在来介绍一下初始化的三种方式现阶段先关注初始化方法就行。。 import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.Spy; import org.mockito.junit.jupiter.MockitoExtension;import org.junit.jupiter.api.BeforeEach; import org.mockito.MockitoAnnotations;import org.mockito.Mockito;/*** 初始化mock/spy对象的第一种方式*/ ExtendWith(MockitoExtension.class) public class TeacherServiceTestMethod1 {Mockprivate TeacherService teacherService;Spyprivate UserService userService;Testpublic void test1(){//Mockito.mockingDetails(teacherService).isMock() 用来判断该对象是不是一个mock的对象System.out.println(Mockito.mockingDetails(teacherService).isMock());System.out.println(Mockito.mockingDetails(userService).isSpy());System.out.println();} }/*** 初始化mock/spy对象的第二种方式*/ class TeacherServiceTestMethod2 {Mockprivate TeacherService teacherService;Spyprivate UserService userService;BeforeEachvoid setUp() {//MockitoAnnotations.initMocks(this); 该方法已过时MockitoAnnotations.openMocks(this);}Testpublic void test1(){System.out.println(Mockito.mockingDetails(teacherService).isMock());System.out.println(Mockito.mockingDetails(userService).isSpy());System.out.println();} }/*** 初始化mock/spy对象的第三种方式*/ class TeacherServiceTestMethod3 {private TeacherService teacherService;private UserService userService;BeforeEachvoid setUp() {userService Mockito.mock(UserService.class);teacherService Mockito.spy(TeacherService.class);}Testpublic void test1(){System.out.println(Mockito.mockingDetails(teacherService).isMock());System.out.println(Mockito.mockingDetails(userService).isSpy());System.out.println();} }我们随意找一个Test方法debug一下只要看到对象是这样就ok了。注意$MockitoMock就是说明模拟成功了 com.surpass.service.UserService$MockitoMock$107038611155e8ec2f2.4 参数匹配 将参数匹配和方法插桩一起示例。。。 2.5 方法插桩 指定调用某个方法时的行为stubbing达到相互隔离的目的。 返回指定值void返回值方法插桩插桩的两种方式 doXxx().when(obj).method(); 其中obj可以使mock/spy对象when(obj.method()).thenXxx();其中obj可以使mock对象 抛异常多次插桩thenAnswer执行真正的原始方法verify的使用 import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doReturn;/*** 参数匹配通过方法签名参数来指定哪些方法调用时需要被处理插桩、verify验证* 注意在只用匹配器是要么都用要么都不用禁止混搭举例* 正确getUserListByTeacher(name, address)或者getUserListByTeacher(anyString(), anyString())* 错误getUserListByTeacher(anyString(), address)*/ ExtendWith(MockitoExtension.class) public class ParamMatcherTest {Mockprivate TeacherService teacherService;/*** 对于mock对象不会调用真实方法直接返回mock对象的默认值* 默认值int、null、空集合*/Testpublic void test1(){TeacherEntity teacher teacherService.getTeacherByName();System.out.println(teacher teacher);SetUserEntity userListByTeacherName teacherService.getUserListByTeacherName();System.out.println(userListByTeacherName userListByTeacherName);}/*** 方法插桩时的参数匹配* 参数匹配时类ArgumentMatchers是匹配参数的主要成员例如* any()则表示某一个方法传入任何类型都符合要求* anyString()则表示字符串类型都符合要求* 注意所有的匹配都不包括null值*/Testpublic void test2(){TeacherEntity teacherEntity new TeacherEntity();teacherEntity.setName(张三);teacherEntity.setAddress(北京);//when(teacherService.getTeacherByName()).thenReturn(teacherEntity); 此行插桩方式也可此插桩意为当执行getTeacherByName方法是会返回之前创建好的对象teacherEntitydoReturn(teacherEntity).when(teacherService).getTeacherByName(any());TeacherEntity teacher teacherService.getTeacherByName(123);System.out.println(teacher teacher);//验证校验teacherService.getTeacherByName()调用的次数之前调了一次所以校验通过如两次则抛异常verify(teacherService, times(1)).getTeacherByName(any());} }控制台将打印如下内容 teacher TeacherEntity(idnull, name张三, address北京, age0)其他项目的解释 Mockprivate ListString mockList;/*** 被插桩的方法在调用时不会执行实际的逻辑直接返回指定的返回值*/Testpublic void test3(){/*** 指定返回值*///方法插桩当调用mockList.get(0)时返回指定返回值“zero”doReturn(zero).when(mockList).get(0);Assertions.assertEquals(zero, mockList.get(0));when(mockList.get(1)).thenReturn(one);Assertions.assertEquals(one, mockList.get(1));/*** void返回值方法插桩*/doNothing().when(mockList).clear();mockList.clear();verify(mockList, times(1)).clear();/*** 抛异常*/doThrow(RuntimeException.class).when(mockList).clear();try {mockList.clear();//断言证明插桩失败Assertions.fail();} catch (Exception e) {Assertions.assertTrue(e instanceof RuntimeException);}//或when(mockList.get(anyInt())).thenThrow(RuntimeException.class);try {mockList.get(4);//断言证明插桩失败Assertions.fail();} catch (Exception e) {Assertions.assertTrue(e instanceof RuntimeException);}/*** 多次插桩* 意为第一次调用返回1第二次调用返回2第三次以及以后调用返回3*/when(mockList.size()).thenReturn(1).thenReturn(2).thenReturn(3);//或-----两者相同when(mockList.size()).thenReturn(1, 2, 3);Assertions.assertEquals(1, mockList.size());Assertions.assertEquals(2, mockList.size());Assertions.assertEquals(3, mockList.size());Assertions.assertEquals(3, mockList.size());}/*** thenAnswer来实现对指定逻辑的插桩*/Testpublic void test4() {when(mockList.get(anyInt())).thenAnswer((AnswerString) invocation - {//getArgument表示获取插桩方法此处为mockList.get(anyInt())的第几个参数值Integer argument invocation.getArgument(0, Integer.class);return String.valueOf(argument * 100);});//执行get方法System.out.println(mockList.get(1));}/*** 调用真实逻辑:控制台打印* 进入方法: getTeacher* TeacherEntity(id1, name123, address北京市, age-1166257546)*/Testpublic void test5() {when(teacherService.getTeacher(any())).thenCallRealMethod();System.out.println(teacherService.getTeacher(123));} 2.6 InjectMocks注解的使用 作用若此注解声明的变量需要用的mock/spy对象mockito会自动将当前类里面的mock/spy对象注入到当中原理构造器注入、setter注入、字段反射注入 TeacherService实现 toString() 方法调用 System.out.println(teacherService); 控制台打印如下内容 TeacherService{teacherDaoteacherDao, userDaouserDao}dubug能够看到两个Dao被自动注入到Service中去。 ExtendWith(MockitoExtension.class) public class InjectMocksTest {/*** 被InjectMocks注解标注的助兴必须是实现类因为mockito会创建对应的实例对象* 未经过mockito处理的普通对象会配合spy注解使其变成默认调用真实方法的mock对象* mockito会使用spy对象或mock对象注入到InjectMocks对应的实例对象中*/SpyInjectMocksprivate TeacherService teacherService;Mockprivate TeacherDao teacherDao;Mockprivate UserDao userDao;Testpublic void test1(){System.out.println(teacherService);} }2.7 断言工具 hamcrestjunit4中引入的第三方断言库junit5中被移除掉了。assertj常用断言库。junit4原生断言库junit5原生断言库 junit5常用断言类库org.junit.jupiter.api.Assertions。
http://www.pierceye.com/news/156120/

相关文章:

  • 网站正则表达式怎么做网站维护一般需要多久
  • 北京网站优化价格有没有做花卉种子的网站啊
  • 资源型网站建设 需要多大硬盘vi设计方案模板
  • 网站怎么做图片放映效果代码怎么生成网站
  • 怎么写代码做网站建投商务网官网
  • 江西那家做网站公司好各类网站建设
  • 做网站和服务器的大小有关吗it培训课程
  • 湖南网站建设公司 搜搜磐石网络网站推广模板
  • 网站是软件吗页网站设计
  • 网站服务器搭建及配置的具体步骤如果自己制作网站
  • 湖北餐饮网站建设做排版的网站
  • 广东省建设教育协会官方网站首页世界上最有趣的网站
  • 平面构成作品网站手机网页qq登录
  • 厦门app开发网站开发公司电话重庆网站排名外包
  • 个人备案经营网站用自己网站做邮箱域名解析
  • 为什么大公司开发网站做英文网站网站犯法吗
  • 大连网站seo陇西网站建设公司
  • 电力建设工程质监总站网站域名使用费用一年多少钱
  • 建设单位网站经费请示上海外国语大学学风建设网站
  • 优秀网站管理员wordpress淘宝客模板下载
  • 广州越秀区网站建设手工制作简单又漂亮
  • 西安商城网站开发网站建设前台后台教程
  • 网站投放天津塘沽爆炸事件
  • 360网站安全检测自己买个服务器做网站
  • 临汾市网站建设网站版式分类
  • 广东的一起(17)做网站东莞建工集团企业网站
  • 最佳外贸英文网站模板六安网站设计公司
  • 为啥网站打开速度慢备案域名怎么弄
  • 门户网站建设主要内容深圳网站有哪些
  • 最好看的免费网站源码龙泉驿最新消息