简介

跟着Kotlin言语在Android开发中越来越盛行,自然也会遇到林林总总的问题。

本篇主要是针对我个人在Android单元查验Kotlin类时遇到的一些问题的考虑和处理计划。

遇到kotlin教程的问题

咱们都知道Kotlin给开发者供给了许多语法糖,其中之一源码之家便是顶层函数,咱们能够直接Kotlin把函数放在代码文件的函数调用中的参数太多顶层,让它不隶属Kotlin于任何类。

它的运用很简略,直接在kotlin代码的恣意方位直接当作一个一般函数调用就行了,而在java中,需求像运用静态办法相同,以文件名+Kt为类android平板电脑多少钱名调用 (默许配备)

在java单元查验中,如果想m函数调用语句ock这个顶层函数,只需求像对待一个静态办法相同,运用mockStatic办法即Kotlin

Android-Kotlin单元测试之 怎样合作Mockito模仿顶层函数

而在kotlin单元查验中,咱们却无法找到这个class

Android-Kotlin单元测试之 怎样合作Mockito模仿顶层函数

承认道路

咱们先建立一个jetbrains什么意思文件来写一个顶层函数,再建立一个单元查验类去查验它:

Android-Kotlin单元测试之 怎样合作Mockito模仿顶层函数

其实从上文中现已能够看出,kotlin的顶层函数在编译之后实践上就变成了一个被class包起来的static办法。对此,咱们能够简略验证一下:

在Android Studio中点击菜单中的Tools->Kotlin源码->Show Kotlin ByteCode,会弹出对应类的字节码,再点击Decompile按钮,咱们会看到确实被编译成了一个类中的静态办法

Android-Kotlin单元测试之 怎样合作Mockito模仿顶层函数

承认了这一点后,咱们只需求在kotlin中拿到这个顶层函数的所属类,就源码怎样做成app软件能够像java里相同运用mockSkotlin教程tatic来仿照了。

剖析进程

已然触及到了运行时类型剖析,自然而然就想到了反射,咱们先引入kotlin的反射库

implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlijetbrains什么意思n_version"

其实我对kotlin的反射并不了解kotlin极简教程,去文档里查阅了一下发现了::sampleTopFun这种写法,它的返回值为一个叫KFunction的接口类,咱们先看看它有哪些办法能够供咱们调用

Android-Kotlin单元测试之 怎样合作Mockito模仿顶层函数

从字面上看好像没有什么办法和咱们的需求有关,怎样办呢?那咱们再看一下它的结束类吧,说不定会有一些私有变量保存了咱们需求的信息。

那么怎样找到它的完kotlin下载结类呢?直接剖析源码扑朔迷离android下载软件app的关系是很耗时且低效的,这儿我采用了了一种取巧的办法,利用Android Studio的Debug功用:函数调用时的实参和形参之间传递

Android-Kotlin单元测试之 怎样合作Mockito模仿顶层函数

源码分享网知道为什么这儿没有办法拿到,但是问题不大,经过Android Studio的东西,咱们能够很简略的得知KFunction被两个类结束了,它们分别是FunctionReferenceFunctionReferenceImpl,而Func源码怎样做成app软件tionReferenkotlin言语ceImpl是承继于Functioandroid系统nReference,咱们将注意力放在FunctionReferKotlinence。同时,在Debugger里,咱们取得了一个重要的信息: KFunctionImpl

依据名字猜测,它应该才是KFunction真实功用结束jetbrains官网的当地,咱们将它的信息翻开

Android-Kotlin单元测试之 怎样合作Mockito模仿顶层函数

能够发现,咱们现已找到咱们想要的那个类了,只需拿到它,后续的mock作业就jetbrains官网很简略了~

初步Mock

源码之家据上文,咱们现已得知了咱们需求获android什么意思取的jCla源码资本ss的途径

咱们先从FunctionReference去获取被reflected引用的KFunctionImpl,这个reflected实践是被FunctionRejetbrains激活码ference承继的CallableRefjetbrains怎样读erence中的一个变量,在FunctionReference供给了一个gekotlin教程tReflected办法,咱们经过反射调用这个办法即可得到这个方针,当然,咱们也能够经过反射Field取得它,但注意到getReflected函数调用过程办法处理了一些空方针的状况,为了保险起见jetbrains idea,咱们仍是jetbrains idea采用反射调用getReflected的办法获取KFunctionI源码资本mpl

Android-Kotlin单元测试之 怎样合作Mockito模仿顶层函数

Android-Kotlin单元测试之 怎样合作Mockito模仿顶层函数

反射调用getReflected办法获取KFunctionImpl

Android-Kotlin单元测试之 怎样合作Mockito模仿顶层函数

第一步没问题,接下来初步反射获取container

Android-Kotlin单元测试之 怎样合作Mockito模仿顶层函数

第二步也没什么问题,接下来就android下载安装是反射获取jClass

Android-Kotlin单元测试之 怎样合作Mockito模仿顶层函数

ok,一切正常,接下来和java相同,让咱们试试用这个咱们获取到的类mockStatic吧

Android-Kotlin单元测试之 怎样合作Mockito模仿顶层函数

能够看到,查验成功经过,至此,咱们成功处理了Moc函数调用kito仿照顶层函数的问题。为了方便运用,能够将以上代码封装成一个函数,这儿就不再赘述了。