7种方法检测安卓模拟器

无论您选择采用TDD还是采用更传统的方法,都将单独测试类。 这通常意味着您使用接口进行编码,并将依赖项注入类中。

去年,我不得不测试一个servlet。 Servlet是展示容器外测试的展示柜,因为它们依赖于doXxx()方法中的所述容器。 这些方法中的每一个都依赖于HttpServletRequestHttpServletResponse 。 两者都是在Servlet API中没有具体实现的接口。 因此,基本上,在您的测试中,您会遇到三个选择:

  1. 使用您的容器实现(糟糕!),
  2. 创建自己的实现(相当耗时),
  3. 使用没有依赖关系的已有实现。

选择第三个选项,我发现了这个小小的珠宝MockRunner 。 MockRunner为您提供以下API和框架的模拟实现:

  • 日本国家发展研究院
  • EJB2,
  • JDBC,
  • JMS,
  • Servlet,
  • TagLib,
  • Struts

所有这些模拟实现均应按需运行。 例如,如果在测试开始时将对象放入模拟会话中,并且此后仍然处于同一请求中,则可以检查对象是否仍在此处。 让我们考虑以下servlet方法进行测试:

@Override
protectedvoiddoGet(HttpServletRequestaRequest,HttpServletResponseaResponse)throwsServletException,IOException{Stringaction=aRequest.getParameter("action");HttpSessionsession=aRequest.getSession();Objectobject=session.getAttribute("number");intnumber=object==null?0:(Integer)object;if("add".equals(action)){number++;session.setAttribute("number",number);}elseif("remove".equals(action)){number--;session.setAttribute("number",number);}elseif("reset".equals(action)){session.setAttribute("number",0);}
}

您如何使用MockRunner测试此代码? 第一件事是从com.mockrunner.servlet.BasicServletTestCaseAdapter继承。 代码如下:

publicclassMockRunnerTestextendsBasicServletTestCaseAdapter{/*** Setup the servlet to test.*/@OverridepublicvoidsetUp()throwsException{super.setUp();createServlet(SessionServlet.class);}/*** Test method for* {@link SessionServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)}.** @throws IOException* @throws ServletException*/publicvoidtestDoGetAdd()throwsServletException,IOException{addRequestParameter("action","add");doGet();Objectobject=getSessionAttribute("number");assertTrue(Integer.class.isAssignableFrom(object.getClass()));intnumber=(Integer)object;assertEquals(1,number);}/*** Test method for* {@link SessionServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)}.** @throws IOException* @throws ServletException*/publicvoidtestDoGetRemove()throwsServletException,IOException{addRequestParameter("action","remove");doGet();Objectobject=getSessionAttribute("number");assertTrue(Integer.class.isAssignableFrom(object.getClass()));intnumber=(Integer)object;assertEquals(-1,number);}/*** Test method for* {@link SessionServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)}.** @throws IOException* @throws ServletException*/publicvoidtestDoGetReset()throwsServletException,IOException{addRequestParameter("action","reset");doGet();Objectobject=getSessionAttribute("number");assertTrue(Integer.class.isAssignableFrom(object.getClass()));intnumber=(Integer)object;assertEquals(0,number);}
}

像这样测试我们的servlet很好,尽管使用MockRunner有一些限制:

  • 您必须继承MockRunner的基类,
  • 因此,您将不得不使用JUnit v3。 您也不能使用TestNG或JUnit v4,
  • 开箱即用的测试功能有限。 如果出于某种原因,您决定创建一个具有其他功能的超级servlet,则必须扩展MockRunner框架。 同样,如果出现新的API,则必须创建自己的适配器,
  • 您必须记住在setUp()方法中调用super.setUp() (确实不是一个好主意),
  • 最后但并非最不重要的一点是,自08年夏季以来,MockRunner项目一直没有任何活动。

然后我对Mockito产生了兴趣。 Mockito是一个“真正的” Mock框架,可增强您的接口,并使用CGLIB进行分类以提供方法的存根:即,您提供了链接到方法调用的代码。 如今,Mockito似乎非常炒作,但趋势仍在流行。 以下代码向您展示了使用Mockito制作的测试类:

publicclassMockitoTest{/** Servlet under test. */privateSessionServletservlet;/** Mock request. */privateHttpServletRequestrequest;/** Mock response. */privateHttpServletResponseresponse;/** Mock session. */privateHttpSessionsession;/** Session's attribute map. */privateMapattributes;/** Request's parameter map. */privateMapparameters;/*** Launches Mockito configuration from annotations.*/@BeforepublicvoidsetUp(){attributes=newHashMap();parameters=newHashMap();servlet=newSessionServlet();request=mock(HttpServletRequest.class);response=mock(HttpServletResponse.class);session=mock(HttpSession.class);when(request.getSession()).thenReturn(session);when(request.getParameterMap()).thenReturn(parameters);when(request.getParameter(anyString())).thenAnswer(newAnswer(){/*** @see org.mockito.stubbing.Answer#answer(org.mockito.invocation.InvocationOnMock)*/@OverridepublicObjectanswer(InvocationOnMockaInvocation)throwsThrowable{Stringkey=(String)aInvocation.getArguments()[0];returnparameters.get(key);}});when(session.getAttribute(anyString())).thenAnswer(newAnswer(){/*** @see org.mockito.stubbing.Answer#answer(org.mockito.invocation.InvocationOnMock)*/@OverridepublicObjectanswer(InvocationOnMockaInvocation)throwsThrowable{Stringkey=(String)aInvocation.getArguments()[0];returnattributes.get(key);}});Mockito.doAnswer(newAnswer(){/*** @see org.mockito.stubbing.Answer#answer(org.mockito.invocation.InvocationOnMock)*/@OverridepublicObjectanswer(InvocationOnMockaInvocation)throwsThrowable{Stringkey=(String)aInvocation.getArguments()[0];Objectvalue=aInvocation.getArguments()[1];attributes.put(key,value);returnnull;}}).when(session).setAttribute(anyString(),anyObject());}/*** Test method for* {@link SessionServlet#doGet(HttpServletRequest, HttpServletResponse)} .** @throws IOException* @throws ServletException*/@TestpublicvoidtestDoGetAdd()throwsServletException,IOException{parameters.put("action","add");servlet.doGet(request,response);Objectobject=attributes.get("number");assertNotNull(object);assertTrue(Integer.class.isAssignableFrom(object.getClass()));intnumber=(Integer)object;assertEquals(1,number);}/*** Test method for* {@link SessionServlet#doGet(HttpServletRequest, HttpServletResponse)} .** @throws IOException* @throws ServletException*/@TestpublicvoidtestDoGetRemove()throwsServletException,IOException{parameters.put("action","remove");servlet.doGet(request,response);Objectobject=attributes.get("number");assertNotNull(object);assertTrue(Integer.class.isAssignableFrom(object.getClass()));intnumber=(Integer)object;assertEquals(-1,number);}/*** Test method for* {@link SessionServlet#doGet(HttpServletRequest, HttpServletResponse)} .** @throws IOException* @throws ServletException*/@TestpublicvoidtestDoGetReset()throwsServletException,IOException{parameters.put("action","reset");servlet.doGet(request,response);Objectobject=attributes.get("number");assertNotNull(object);assertTrue(Integer.class.isAssignableFrom(object.getClass()));intnumber=(Integer)object;assertEquals(0,number);}
}

Mockito严重缺乏针对新手的文档。 尽管Mockito类有充分的文献资料,但我认为应该对哲学和体系结构进行外部介绍。 不过,这是我可以解决的许多Google Code项目的限制。

恕我直言,MockRunner与API集成程度更高,隐藏了实现细节,而对于Mockito,您需要了解实现以提供足够的存根。 Mockito的测试类的代码大小约为MockRunner的两倍。 因此,尽管会迫使我使用旧版本的JUnit,并在没有此类约束的情况下使用Mockito,但我将继续使用MockRunner来使用其集成API的类。

总之,我承认这两种测试工具都具有截然不同的方法和范围。 我仍然觉得Mockito的使用有点复杂。

使自己的想法:

  • 模拟赛跑者
  • 莫基托

翻译自: https://blog.frankel.ch/two-different-mocking-approaches/

7种方法检测安卓模拟器

7种方法检测安卓模拟器_两种不同的模拟方法相关推荐

  1. 创建安卓模拟器的两种方式及常用Android命令介绍

    创建安卓模拟器有以下两种方式: 1>通过图形界面创建,在Eclipse中单击Windows->Android Virtual Device Manager启动图形界面窗口 2>如果用 ...

  2. 烽火HG680-KB_Hi3798MV310_当贝桌面_强刷及免拆_两种方法-卡刷固件包

    烽火HG680-KB_Hi3798MV310_当贝桌面_强刷及免拆_两种方法-卡刷固件包-内有短接点及教程 特点: 1.适用于对应型号的电视盒子刷机: 2.开放原厂固件屏蔽的市场安装和u盘安装apk: ...

  3. [css] 如何重写行内样式?方法有哪些(至少两种)?

    [css] 如何重写行内样式?方法有哪些(至少两种)? 1, !important 最高级 2, var divStyle = document.querySelector('#div').style ...

  4. x86跑android,ARM跑Win,X86跑安卓,为什么两种架构互相“踢馆”?

    原标题:ARM跑Win,X86跑安卓,为什么两种架构互相"踢馆"? 最近,Android X86项目终于升级到了Android 11底层,基于安卓的Bliss OS 14也因此让X ...

  5. 编程每种语言有什么用_每种情况的最佳编程语言

    编程每种语言有什么用 有一个问题,很多人都认为提问者根本不理解该主题. 有些人甚至觉得它很生气. 问题的形式通常是什么是最佳X? 什么是最好的车? 最好的编程语言是什么? 但是同时,这是一个问题,我们 ...

  6. java 产生随机数的两种方式,Java产生随机数的两种方式

    Java产生随机数的两种方式 Java产生随机数的两种方式 在java中,我们可以通过两种方式来获取随机数(generating a random number)一种是大家熟悉的java.lang.M ...

  7. html中怎么给长方形填充颜色,PS怎么在一个矩形里填充两种颜色 ps给矩形填充两种颜色的教程...

    PS怎么在一个矩形里填充两种颜色?看到别人设计的作品中,一个矩形被填充了两种不同颜色,这是如何操作的呢?ps小白们或许还不太清楚吧,今天,小编为大家带来了ps给矩形填充两种颜色的教程.感兴趣的朋友快来 ...

  8. iphone新旧手机数据传输已取消_两种方法轻松让iPhone实现APP互传,再也不羡慕安卓手机...

    安卓是一个开放式的系统,虽然不及封闭的iOS系统那么安全,但是使用中的便利程度的确比iOS高,包括APP的安装和分享.安卓系统安装APP只需要一个apk文件即可,这个apk文件可以通过蓝牙或者WiFi ...

  9. popoupwindow 点击背景消失_两种去除背景音乐保留原声的高效方法

    方法一:Au软件提取人声法 一.Pr工序部分 ①打开pr,导入所需要的用到的视频素材. ②截取所需要用到的人声素材. ③导出素材,选择MP3格式,开始导入指定文件夹.这样相比于导出MP4格式的视频来说 ...

最新文章

  1. @Value竟然能玩出这么多花样
  2. 牛逼!一个故事讲清楚 NIO 了
  3. 2018-2019-1 20165226 《信息安全系统设计基础》第4周学习总结
  4. python实训报告pygame_[源码和文档分享]基于Python的PyGame库实现的2048小游戏
  5. python 循环触发一次_Python中的循环
  6. C++ Primer 5th笔记(chap 17 标准库特殊设施)smatch
  7. Thymeleaf循环遍历
  8. 我的第一个C#版GDI+程序
  9. foreach 实现 MyBatis 遍历集合与批量操作数据
  10. 每日一题:leetcode190.颠倒二进制位
  11. 用solidity语言开发代币智能合约
  12. python摄像头跟随人脸_Python3利用Dlib实现摄像头实时人脸检测和平铺显示示例
  13. Python与Go插入排序
  14. 基于TVUE框架在中型移动端项目的直出同构实践
  15. acme部署https证书
  16. 1.(MySQL Router+MGR)MySQL Shell安装与用法
  17. gopher协议总结
  18. phyper函数计算的显著性到底是什么?
  19. Nuscenes SOTA!LOPR: 使用生成模型进行潜在occupancy预测
  20. 截图识别文本OCR软件

热门文章

  1. linux awk过滤符号,shell文本过滤之awk命令
  2. 排查构建镜像时 IO 慢的问题
  3. MACE源码解析【GPU内存排布技巧】
  4. c在线编译器(c语言在线编程)
  5. wordpress主题php,开发WordPress主题的利器——PHPStorm
  6. 学习Python,先学好这些快捷键!
  7. 中级软件设计师考试经验总结
  8. 改变一生的五句话 !!!
  9. OPJ-1067 取石子游戏 解题报告(数论) 取石子游戏,betty定理
  10. 力扣:455. 分发饼干