


下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
使⽤Mockito对异步⽅法进⾏单元测试原⽂链接:译⽂出⾃:译者:之前我拍着胸脯承诺要维护的我博客,因此才有了这篇⽂章。但是请忘记我的那些承诺,我今天要写的是关于,这是⼀个当你写单元测试时经常会⽤到的对象Mock框架。介绍这篇⽂章假设你已经知道了什么是以及为什么你要写单元测试。另外,我强烈建议你阅读。常见的场景有些时候我们需要测试有回调的函数,这意味着它们是异步执⾏的。这些⽅法测试起来并不那么容易,使⽤Thread.sleep(milliseconds)来等待它们执⾏完成只能说是⼀种蹩脚的实现,并且会让你的测试具有不确定性。那么我们如何来对异步函数进⾏测试呢?拯救了我们!翠花,上⽰例假设我们有⼀个实现了DummyCallback接⼝的DummyCaller类,在DummyCaller中有⼀个doSomethingAsynchronously()函数,该函数会调⽤DummyCollaborator类的doSomethingAsynchronously(DummyCallbackcallback)函数,在调⽤该函数时将这个callback参数设置为该DummyCaller对象。当doSomethingAsynchronously(DummyCallbackcallback)的任务在后台线程中执⾏完成之后就会回调这个callback。还是直接看代码会更容易理解:DummyCallback接⼝:DummyCaller类:真正的异步执⾏操作的DummyCollaborator类。创建我们的测试类我们有2种不同的选择来测试我们的异步函数,但是⾸先我们先创建⼀个DummyCollaboratorCallerTest测试类。publicinterfaceDummyCallback{publicvoidonSuccess(List<String>result);publicvoidonFail(intcode);}1234publicclassDummyCallerimplementsDummyCallback{//执⾏异步操作的代理类privatefinalDummyCollaboratordummyCollaborator;//执⾏结果1234publicclassDummyCollaborator{publicstaticintERROR_CODE=1;publicDummyCollaborator(){1234//empty}publicvoiddoSomethingAsynchr在setup函数中我们使⽤MockitoAnotations来初始化Mock和ArgumentCaptor,我们暂时还不需要关⼼它们。在这⾥我们需要关⼼的是在测试执⾏之前初始化了Mock对象和被测试的类,这些初始化代码都在setup中。记住,所有要测试的函数都要被测试两次。让我们来看看下⾯的两种测试⽅案。为我们的回调设置⼀个Anwser这是我们使⽤doAnswer()来为⼀个函数进⾏打桩以测试异步函数的测试⽤例。这意味着我们需要理解返回⼀个回调(同步的),当被测试的⽅法被调⽤时我们⽣成了⼀个通⽤的anwser,这个回调会被执⾏。最后,我们调⽤了doSomethingAsynchronously函数,并且验证了状态和交互结果。[译者注:在doAnswer函数中当调⽤mockDummyCollaborator对象的doSomethingAsynchronously(finalDummyCallbackcallback)函数时会触发Answer匿名内部类的answer(InvocationOnMockinvocation)函数]。使⽤ArgumentCaptor第⼆种实现是使⽤ArgumentCaptor。在这⾥我们的callback是异步的:我们通过ArgumentCaptor捕获传递到DummyCollaborator对象的DummyCallback回调。最终,我们可以在测试函数级别进⾏所有验证,当我们想验证状态和交互结果时可以调⽤onSuccess()。结论两种实现的主要的不同点是当使⽤⽅案时我们创建了⼀个匿名内部类,并且将它的元素从invocation.getArguments()[n]转换到我们需要的类型,但是万⼀我们修改了我们的参数类型,那么这个测试就会’failfast’。另⼀⽅⾯,当我们使⽤时我们可能能够更精细的控制测试⽤例,因为我们能在测试⽤例中⼿动调⽤回调对象。⾯对这两种⽅案,有时候我们不知道作何选择,但是不⽤担⼼,因为这是⼀个常见的问题。以我们的经验来看,同时使⽤这两种⽅案来测试异步函数会是⼀个更可靠的途径。我希望这篇⽂章对你有⽤,另外,请记住,欢迎给这篇⽂章的反馈,或许还有更好的实现。当然,如果你有任何的疑问也可以联系我。⽰例代码。这些代码都是关于Java和Android的,因为我们在⼏个⽉前做了⼀场相关的演讲。深⼊拓展我强烈建议你阅读以对这个框架有更深⼊的了解,这份⽂档⾮常清晰,并且有⾮常棒的⽰例!publicclassDummyCollaboratorCallerTest{//要测试的类型privateDummyCallerdummyCaller;@MockprivateDummyCollaboratormockDummyC1234@TestpublicvoidtestDoSomethingAsynchronouslyUsingDoAnswer(){Arrays.asList("One","Two","Three");finalList<String>results=1234
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 肠息肉手术后的饮食护理
- 2024年CFA考试复习试题及答案指南
- 采购管理培训教程
- 职业暴露流程处理
- 新生儿黄疸管理:循证实践与质量提升
- 行业薪酬报告
- 2024年CFA考试必读书籍及试题及答案
- 金融分析师考前最后冲刺试题及答案
- CFA考试战略规划与试题及答案
- 高效课堂教师培训
- 2022年江苏省无锡市中考地理试题及参考答案
- Z世代消费态度洞察报告
- 水电站监理部帷幕灌浆培训讲义ppt(18页)
- 招聘求职简历制作表格模板可编辑下载 精品面试简历模板 单页简历优雅简约单页16
- 服务质量控制QoSPPT课件[通用]
- 铁路项目桥梁墩台身施工方案
- 特种设备台账格式模板【新版】
- 油田项目部职工大会行政工作报告(终稿)
- 管理人员进车间安全事项
- (完整版)筏板基础施工方案
- 桥架一点通大全
评论
0/150
提交评论