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

911制作网站如何进网站

911制作网站,如何进网站,视觉传播设计与制作,网站建设冫首先金手指十五一、Mockito与PowerMock简述Mockito与PowerMock都是Java流行的一种Mock框架#xff0c;使用Mock技术能让我们隔离外部依赖以便对我们自己的业务逻辑代码进行单元测试#xff0c;在编写单元测试时#xff0c;不需要再进行繁琐的初始化工作#xff0c;在需要调用某一个接口时…一、Mockito与PowerMock简述Mockito与PowerMock都是Java流行的一种Mock框架使用Mock技术能让我们隔离外部依赖以便对我们自己的业务逻辑代码进行单元测试在编写单元测试时不需要再进行繁琐的初始化工作在需要调用某一个接口时直接模拟一个假方法并任意指定方法的返回值。Mockito的工作原理是通过创建依赖对象的proxy所有的调用先经过proxy对象proxy对象拦截了所有的请求再根据预设的返回值进行处理。PowerMock则在Mockito原有的基础上做了扩展通过修改类字节码并使用自定义ClassLoader加载运行的方式来实现mock静态方法、final方法、private方法、系统类的功能。从两者的项目结构中就可以看出PowerMock直接依赖于Mockito所以如果项目中已经导入了PowerMock包就不需要再单独导入Mockito包如果两者同时导入还要小心PowerMock和Mockito不同版本之间的兼容问题Mockito包依赖org.mockitomockito-core2.23.0testPowerMock包依赖org.powermockpowermock-module-junit42.0.0-RC.3testorg.powermockpowermock-api-mockito22.0.0-RC.3test二、Mockito的使用Mockito一般通过创建mock或spy对象并制定具体返回规则来实现模拟的功能在调用完成后还可以进行方法调用验证以检验程序逻辑是否正确。mock和spy对象的区别是mock对象对于未指定处理规则的调用会按方法返回值类型返回该类型的默认值(如int、long则返回0boolean则返回false对象则返回nullvoid则什么都不做)而spy对象在未指定处理规则时则会直接调用真实方法。以下3个类是我们的项目中需要用到的一些业务类//实体类public class Node {private int num;private String name;//以下忽略所有构造方法和get、set方法}//本地负责实现具体业务的业务类public class LocalServiceImpl implements ILocalService {//外部依赖Autowiredprivate IRemoteService remoteService;//具体业务处理方法Overridepublic Node getRemoteNode(int num) {return remoteService.getRemoteNode(num);}//以下忽略其他业务调用方法在后面例子中补充}//外部依赖业务类由其他人实现可能我们的业务类写好了别人还没写好public class RemoteServiceImpl implements IRemoteService {//外部类提供的一些业务方法Overridepublic Node getRemoteNode(int num) {return new Node(num, Node from remote service);}//其他业务方法在后面例子中补充}下面是Mockito具体使用的一些示例mock外部依赖对象并注入到我们的业务类中以便在单元测试中进行模拟调用RunWith(MockitoJUnitRunner.class) //让测试运行于Mockito环境public class LocalServiceImplMockTest {InjectMocks //此注解表示这个对象需要被注入mock对象private LocalServiceImpl localService;Mock //此注解会自动创建1个mock对象并注入到InjectMocks对象中private RemoteServiceImpl remoteService;//如果不使用上述注解可以使用Before方法来手动进行mock对象的创建和注入但会几行很多代码/*private LocalServiceImpl localService;private RemoteServiceImpl remoteService;Beforepublic void setUp() throws Exception {localService new LocalServiceImpl();remoteService Mockito.mock(RemoteServiceImpl.class); //创建Mock对象Whitebox.setInternalState(localService, remoteService, remoteService); //注入依赖对象}*/Testpublic void testMock() {Node target new Node(1, target); //创建一个Node对象作为返回值Mockito.when(remoteService.getRemoteNode(1)).thenReturn(target); //指定当remoteService.getRemoteNode(int)方法传入参数为1时返回target对象Node result localService.getRemoteNode(1); //调用我们的业务方法业务方法内部调用依赖对象方法assertEquals(target, result); //可以断言我们得到的返回值其实就是target对象assertEquals(1, result.getNum()); //具体属性和我们指定的返回值相同assertEquals(target, result.getName()); //具体属性和我们指定的返回值相同Node result2 localService.getRemoteNode(2); //未指定参数为2时对应的返回规则assertNull(result2); //未指定时返回为null}}spy外部依赖对象并注入到我们的业务类中RunWith(MockitoJUnitRunner.class)public class LocalServiceImplSpyTest {InjectMocksprivate LocalServiceImpl localService;Spy //注意这里使用的是Spy注解private RemoteServiceImpl remoteService;//注意如果自己创建spy对象的话要这么写/*remoteService new RemoteServiceImpl(); //先创建一个具体实例remoteService Mockito.spy(remoteService); //再调用Mockito.spy(T)方法创建spy对象*/Testpublic void testSpy() {Node target new Node(1, target); //创建一个Node对象作为返回值Mockito.when(remoteService.getRemoteNode(1)).thenReturn(target); //指定当remoteService.getRemoteNode(int)方法传入参数为1时返回target对象Node result localService.getRemoteNode(1); //调用我们的业务方法业务方法内部调用依赖对象方法assertEquals(target, result); //可以断言我们得到的返回值其实就是target对象assertEquals(1, result.getNum()); //具体属性和我们指定的返回值相同assertEquals(target, result.getName()); //具体属性和我们指定的返回值相同Node result2 localService.getRemoteNode(2); //未指定参数为2时的调用规则所以会直接调用真实对象返回remote创建的节点assertEquals(2, result2.getNum());assertEquals(Node from remote service, result2.getName()); //remoteService创建Node对象时设置name属性为Node from remote service}}使用ArgumentMatchers的any系列方法指定多种返回值有any()、anyInt()、anyString()、anyByte()、anyLong()等等可以看下ArgumentMatchers类源码中定义的所有方法Testpublic void testAny() {Node target new Node(1, target);when(remoteService.getRemoteNode(anyInt())).thenReturn(target); //静态导入Mockito.when和ArgumentMatchers.anyInt后可以简化代码提升可读性Node result localService.getRemoteNode(20); //上面指定了调用remoteService.getRemoteNode(int)时不管传入什么参数都会返回target对象assertEquals(target, result); //可以断言我们得到的返回值其实就是target对象assertEquals(1, result.getNum()); //具体属性和我们指定的返回值相同assertEquals(target, result.getName()); //具体属性和我们指定的返回值相同}指定mock对象多次调用的返回值/*** 指定mock多次调用返回值*/Testpublic void testMultipleReturn() {Node target1 new Node(1, target);Node target2 new Node(1, target);Node target3 new Node(1, target);when(remoteService.getRemoteNode(anyInt())).thenReturn(target1).thenReturn(target2).thenReturn(target3);//第一次调用返回target1、第二次返回target2、第三次返回target3Node result1 localService.getRemoteNode(1); //第1次调用assertEquals(target1, result1);Node result2 localService.getRemoteNode(2); //第2次调用assertEquals(target2, result2);Node result3 localService.getRemoteNode(3); //第3次调用assertEquals(target3, result3);}指定mock对象抛出异常(注意如果方法中未声明会抛出异常只能指定抛出运行时异常如果仍指定为抛出受检查异常运行时会报错误org.mockito.exceptions.base.MockitoException: Checked exception is invalid for this method!)//RemoteServiceImpl方法Overridepublic Node getRemoteNode(String name) throws MockException {if (StringUtils.isEmpty(name)) {throw new MockException(name不能为空, name);}return new Node(name);}//LocalServiceImpl方法Overridepublic Node getRemoteNode(String name) throws MockException {try {return remoteService.getRemoteNode(name);} catch (IllegalArgumentException e) {throw e;}}/*** 指定mock对象已声明异常抛出的方法抛出受检查异常*/Testpublic void testExceptionDeclare() {try {Node target new Node(1, target);when(remoteService.getRemoteNode(name)).thenReturn(target).thenThrow(new MockException(message, exception)); //第一次调用正常返回第二次则抛出一个ExceptionNode result1 localService.getRemoteNode(name);assertEquals(target, result1); //第一次调用正常返回Node result2 localService.getRemoteNode(name); //第二次调用不会正常返回会抛出异常assertEquals(target, result2);} catch (MockException e) {assertEquals(exception, e.getName()); //验证是否返回指定异常内容assertEquals(message, e.getMessage()); //验证是否返回指定异常内容}}/*** 指定mock对象为声明异常抛出的方法抛出运行时异常*/Testpublic void testRuntimeException() {Node target new Node(1, target);when(remoteService.getRemoteNode(1)).thenThrow(new RuntimeException(exception)); //指定调用时抛出一个运行时异常try {Node result localService.getRemoteNode(1);assertEquals(target, result);} catch (RuntimeException e) {assertEquals(exception, e.getMessage());}}/*** 指定mock对象未声明异常抛出的方法抛出受检查异常以下方法执行会报错*/Testpublic void testNotDefineCheckedException() {Node target new Node(1, target);when(remoteService.getRemoteNode(1)).thenThrow(new IOException(io exception));try {Node result localService.getRemoteNode(1);assertEquals(target, result);} catch (Exception e) {assertEquals(io exception, e.getMessage());}}mock void方法抛异常、什么都不做//RemoteServiceImpl方法Overridepublic void doSometing() {System.out.println(remote service do something!);}//LocalServiceImpl方法Overridepublic void remoteDoSomething() {remoteService.doSometing();}//注意void方法没有返回值所以mock规则写法顺序不一样doNothing().when(remoteService).doSometing();doThrow(new RuntimeException(exception)).when(remoteService).doSometing();校验mock对象的调用情况(除Mockito中的never()、times(int)方法外还有atLeast(int)、atLeastOne()、atMost(int)等方法)/*** 校验mock对象和方法的调用情况**/public void testVerify() {Node target new Node(1, target);when(remoteService.getRemoteNode(anyInt())).thenReturn(target);verify(remoteService, never()).getRemoteNode(1); //mock方法未调用过localService.getRemoteNode(1);Mockito.verify(remoteService, times(1)).getRemoteNode(anyInt()); //目前mock方法调用过1次localService.getRemoteNode(2);verify(remoteService, times(2)).getRemoteNode(anyInt()); //目前mock方法调用过2次verify(remoteService, times(1)).getRemoteNode(2); //目前mock方法参数为2只调用过1次}利用ArgumentCaptor捕获方法参数进行mock方法参数校验/*** 利用ArgumentCaptor捕获方法参数进行mock方法参数校验*/Testpublic void testCaptor() throws Exception {Node target new Node(1, target);when(remoteService.getRemoteNode(anyString())).thenReturn(target);localService.getRemoteNode(name1);localService.getRemoteNode(name2);verify(remoteService, atLeastOnce()).getRemoteNode(localCaptor.capture()); //设置captorassertEquals(name2, localCaptor.getValue()); //获取最后一次调用的参数List list localCaptor.getAllValues(); //按顺序获取所有传入的参数assertEquals(name1, list.get(0));assertEquals(name2, list.get(1));}mock对象调用真实方法/*** mock对象调用真实方法*/Testpublic void testCallRealMethod() {when(remoteService.getRemoteNode(anyInt())).thenCallRealMethod(); //设置调用真实方法Node result localService.getRemoteNode(1);assertEquals(1, result.getNum());assertEquals(Node from remote service, result.getName());}重置mock对象//重置mock清除所有的调用记录和返回规则Mockito.reset(remoteService);校验mock对象0调用和未被验证的调用/*** 校验mock对象0调用和未被验证的调用*/Test(expected NoInteractionsWanted.class)public void testInteraction() {verifyZeroInteractions(remoteService); //目前还未被调用过执行不报错Node target new Node(1, target);when(remoteService.getRemoteNode(anyInt())).thenReturn(target);localService.getRemoteNode(1);localService.getRemoteNode(2);verify(remoteService, times(2)).getRemoteNode(anyInt());// 参数1和2的两次调用都会被上面的anyInt()校验到所以没有未被校验的调用了verifyNoMoreInteractions(remoteService);reset(remoteService);localService.getRemoteNode(1);localService.getRemoteNode(2);verify(remoteService, times(1)).getRemoteNode(1);// 参数2的调用不会被上面的校验到所以执行会抛异常verifyNoMoreInteractions(remoteService);}三、PowerMock的使用PowerMock的使用与Mockito有一些不同首先是测试类上的RunWith注解需要修改为RunWith(PowerMockRunner.class)第二是需要使用到PrepareForTest注解(PrepareFotTest注解会修改传入参数类的字节码通过修改字节码达到模拟final、static、私有方法、系统类等的功能)此注解可写在类上也可写在方法上PrepareForTest(RemoteServiceImpl.class)mock new关键字//LocalServiceImplOverridepublic Node getLocalNode(int num, String name) {return new Node(num, name);}/*** mock new关键字*/TestPrepareForTest(LocalServiceImpl.class) //PrepareForTest修改local类的字节码以覆盖new的功能public void testNew() throws Exception {Node target new Node(1, target);//当传入任意int且name属性为name时new对象返回为target//当参数条件使用了any系列方法时剩余的参数都得使用相应的模糊匹配规则如eq(name)代表参数等于name//剩余还有isNull(), isNotNull(), isA()等方法PowerMockito.whenNew(Node.class).withArguments(anyInt(), eq(name)).thenReturn(target);Node result localService.getLocalNode(2, name);assertEquals(target, result); //返回值为targetassertEquals(1, result.getNum());assertEquals(target, result.getName());//未指定name为test的返回值默认返回nullNode result2 localService.getLocalNode(1, test);assertNull(result2);}mock final方法//RemoteServiceImplOverridepublic final Node getFinalNode() {return new Node(1, final node);}/*** mock final方法*/TestPrepareForTest(RemoteServiceImpl.class) //final方法在RemoteServiceImpl类中public void testFinal() {Node target new Node(2, mock);PowerMockito.when(remoteService.getFinalNode()).thenReturn(target); //指定返回值Node result remoteService.getFinalNode(); //直接调用final方法返回mock后的值assertEquals(target, result); //验证返回值assertEquals(2, result.getNum());assertEquals(mock, result.getName());}mock static方法//Nodepublic static Node getStaticNode() {return new Node(1, static node);}/*** mock static方法*/TestPrepareForTest(Node.class) //static方法定义在Node类中public void testStatic() {Node target new Node(2, mock);PowerMockito.mockStatic(Node.class); //mock static方法前需要加这一句PowerMockito.when(Node.getStaticNode()).thenReturn(target); //指定返回值Node result Node.getStaticNode(); //直接调用static方法返回mock后的值assertEquals(target, result); //验证返回值assertEquals(2, result.getNum());assertEquals(mock, result.getName());}mock private方法//RemoteServiceImplOverridepublic Node getPrivateNode() {return privateMethod();}//RemoteServiceImplprivate Node privateMethod() {return new Node(1, private node);}/*** mock 私有方法*/TestPrepareForTest(RemoteServiceImpl.class) //private方法定义在RemoteServiceImpl类中public void testPrivate() throws Exception {Node target new Node(2, mock);//按照真实代码调用privateMethod方法PowerMockito.when(remoteService.getPrivateNode()).thenCallRealMethod();//私有方法无法访问类似反射传递方法名和参数此处无参数故未传PowerMockito.when(remoteService, privateMethod).thenReturn(target);Node result remoteService.getPrivateNode();assertEquals(target, result); //验证返回值assertEquals(2, result.getNum());assertEquals(mock, result.getName());}mock 系统类方法//RemoteServiceImplOverridepublic Node getSystemPropertyNode() {return new Node(System.getProperty(abc));}/*** mock 系统类方法*/TestPrepareForTest(RemoteServiceImpl.class) //类似new关键字系统类方法的调用在类RemoteServiceImpl中所以这里填的是RemoteServiceImplpublic void testSystem() {PowerMockito.mockStatic(System.class); //调用的是系统类的静态方法所以要加这一句PowerMockito.when(System.getProperty(abc)).thenReturn(mock); //设置System.getProperty(abc)返回mockPowerMockito.when(remoteService.getSystemPropertyNode()).thenCallRealMethod(); //设置mock对象调用实际方法Node result remoteService.getSystemPropertyNode(); //按代码会返回一个name属性为mock的对象assertEquals(0, result.getNum()); //int默认值为0assertEquals(mock, result.getName()); //remoteService对象中调用System.getProperty(abc)返回的是上面设置的mock}项目代码已上传至GitHubMockDemo
http://wiki.neutronadmin.com/news/298063/

相关文章:

  • 网站如何排名做新媒体应该关注什么网站
  • 广东贸易网站建设投资公司成立条件
  • 温州通业建设工程有限公司网站wordpress缩略图不清晰怎么办
  • 网站建设 58同城小程序发布流程怎么弄
  • 公司做网站应记入哪个会计科目商丘哪里做网站比较好
  • 一个新的网站怎么做优化推广普通话调查问卷
  • 有了域名如何做网站北京工程建设交易信息网站
  • 公司网站建设济南凡科建站容易吗
  • 做网站怎么插音频怎么开通网站
  • 网站设计师工作内容chinaz站长素材
  • 贵州便宜网站推广优化电话深圳工程交易服务网
  • 网站管理功能图网站开发设计进度表
  • wordpress自定义面板百度seo学院
  • 不用wordpress建站安卓手机怎么制作网站
  • 租赁服务器的网站公司网站做一年多少钱
  • 网站ui设计收费汕尾英文网站建设
  • 做网站最简单的wordpress管理网址
  • 什么网站可以做ui小动画途牛电子商务网站建设
  • 服装企业官方网站宁波有哪些公司做网站
  • wap 网站谁做的四虎网站是多少
  • 官方网站怎样做旅游网站开发的需求分析
  • 橱柜网站建设公司汽车是怎么做的视频网站
  • 东莞网站建设php方案网站建设2017排名
  • 头像设计制作网站石家庄做网站最好的公司
  • 能够做外贸的网站有哪些织梦手机网站教程
  • 口碑好的天津网站建设公司介绍简历模板
  • led网站模板危险网站怎么解除
  • 怎么仿做网站海外网络推广平台
  • 南通网站排名优化做药的文献一般在哪些网站查找
  • 广州网站制作怎样asp网站建设下载