作者:Antonio Leiva

时间:Mar 2, 2017

原文链接:https://antonioleiva.com/mockito-2-kotlin/

如我们在前面文章中谈到的,Kotlin最常见的问题之一是,在默认情况下,所有类和函数都是关闭的。

这就是说,如果你要mock一个类(这在Java测试中,这些可能是非常普通的),你或是需要用保留字open将其打开,或是将其提取出一个接口。

这两种方法都可能是令人厌烦的,事实上他们限制Java开发者使用Kotlin。

幸运的是,Mockito 2 除去了这一限制,今天我计划教你怎样做。

那问题是什么?

想象你在Kotlin中有一个类,它像这样:

 class ClosedClass {

     fun doSomething() {
}
}

你需要测试调用该类的doSomething方法。

其方法是这样:

 @Test fun testClosedClass() {
val c = Mockito.mock(ClosedClass::class.java)
c.doSomething()
verify(c).doSomething()
}

如果你用 Mockito 1.x版本,你会得到下面错误:

Mockito cannot mock/spy following:

– final classes

– anonymous classes

– primitive types

将更新依赖关系到Mockito 2

如我们所说,Mockito 2 完全能够mock它,所以我们要更新依赖关系。在编写这篇文章是,Mockito 2的最新版本是2.8.9。但是,由于它们最近经常更新,请检查其最新版本。

 testCompile 'org.mockito:mockito-core:2.8.9'

现在我们再次运行代码,仍然是失败!

Mockito cannot mock/spy because :

– final class

虽然,我们根本没有限制mock匿名类或原始类型,但是它不同于final类。这是为什么?

这个选项仍是一个实验性,要求手动激活它。

使能mock final classes选择

要使能它,你需要在文件夹test/resources/mockito-extensions下创建org.mockito.plugins.MockMaker文件:

它是一个简单的文本文件:

 mock-maker-inline

再没其它内容。

现在,你能够再次测试,并看到它运行正常。非常棒!

Mock属性

你也能mock属性,且也没有问题。例如,如果我们修改这个类的代码:

 class ClosedClass(val prop: Int) {

     fun doSomething() {
}
}

来让我们看看mock的属性值:

 @Test fun testClosedClass() {
val c = Mockito.mock(ClosedClass::class.java)
`when`(c.prop).thenReturn(3) val prop = c.prop
assertEquals(3, prop)
}

我要求其返回3。其后,我检查值是正确的。

你也能够检查属性已经被调用:

 verify(c).prop

结论

如你所见,在最流行mock库的最新版本中所有限制的消失了。

所以再没有借口了!现在就可以使用Kotlin编写你的所有测试。

请记住,你可以在这本免费指南找到所有这些内容以及更多详细内容,它将帮助你建立你的第一个项目;或在这本书中,你可以学习怎样从头开始创建一个完整的应用程序。

在Kotlin上怎样用Mockito2 mock final 类(KAD 23)的更多相关文章

  1. 用PowerMock mock final类

    mock final类相对简单,直接贴代码 被测方法: public class FinalEmployeeService { public void insertEmployee(Employee ...

  2. Mockito不能mock final类的解决办法

    Mockito是很常用的测试工具,使用过程中可能会遇到下面的问题: Mockito cannot mock/spy because : - final class 问题重现: 引入该依赖到项目的mav ...

  3. 用PowerMock mock final类constructors

    也相对简单,直接贴代码 被测方法 public class EmployeeServiceWithParam { public void createEmployee(final Employee e ...

  4. PowerMock学习(六)之Mock Final的使用

    Mock Final mockfinal相对来说就比较简单了,使用powermock来测试使用final修饰的method或class,比较简单,接口调用部分,还是service调用dao. 对于接口 ...

  5. 无所不能的PowerMock,mock私有方法,静态方法,测试私有方法,final类

    1.为什么要用mock 我的一本书的解释: (1)创建所需的DB数据可能需要很长时间,如:调用别的接口,模拟很多数据 (2)调用第三方API接口,测试很慢, (3)编写满足所有外部依赖的测试可能很复杂 ...

  6. Kotlin——中级篇(一):类(class)详解

    在任何一门面向对象编程的语言里,类(class)是非常基础.但也是非常重要的一项组成,通俗的说就是万般皆对象,而所说的对象就是我们生成的类.Kotlin也是如此,下面详细为大家介绍Kotlin中的类的 ...

  7. Kotlin学习笔记(9)- 数据类

    系列文章全部为本人的学习笔记,若有任何不妥之处,随时欢迎拍砖指正.如果你觉得我的文章对你有用,欢迎关注我,我们一起学习进步! Kotlin学习笔记(1)- 环境配置 Kotlin学习笔记(2)- 空安 ...

  8. Java不可变类与final类

    概念 Java的不可变类是指八个基础类型的包装类和String,他们的数据成员是不可变的.使用加法等操作时,其实是创建了一个新的对象. Java的final类是对类用关键字final进行修饰,说明该类 ...

  9. 动态绑定、阻止继承,final类和方法

    1.编译器查看对象的声明类型和方法名.当调用 x.f(param); 且隐式参数x生命为C类对象.这时候可能有多个名字都叫f,但是参数类型不一样的方法.编译器会一一列举C类中名为f的方法和其超类中访问 ...

随机推荐

  1. spring boot应用启动原理分析

    spring boot quick start 在spring boot里,很吸引人的一个特性是可以直接把应用打包成为一个jar/war,然后这个jar/war是可以直接启动的,不需要另外配置一个We ...

  2. vue---组件引入及使用的几种方式

    在vue的项目开发过程中,基本都是基于组件化开发项目,总结下使用组件的几个点: 一.@符号的使用 在vue项目中 @ 符号代表的是根目录,即 src 目录. 二.组件的放置位置 在项目中,公用的组件放 ...

  3. 【洛谷T37388】P哥破解密码

    原题图: 看到这个题,首先想到的当然是暴力打表找规律了 表: 1 2 2 4 3 7 4 13 5 24 6 44 7 81 8 149 9 274 10 504 11 927 12 1705 13 ...

  4. Android学习笔记_16_添加多个Activity、参数传递、请求码和结果码使用

    一.添加新的Activity步骤: 第一步:新建一个继承Activity的类,如:NewActivity public class NewActivity extends Activity { @Ov ...

  5. LeetCode10.正则表达式匹配 JavaScript

    给定一个字符串 (s) 和一个字符模式 (p).实现支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符. '*' 匹配零个或多个前面的元素. 匹配应该覆盖整个字符串 (s) ,而不 ...

  6. ajax请求相关问题

    Ajax中async:false/true的作用: async. 默认是 true,即为异步方式,$.ajax执行后,会继续执行ajax后面的脚本,直到服务器端返回数据后,触发$.ajax里的succ ...

  7. Spring知识点小结(一)

    一.Spring的简介 1.spring是一个full-stack轻量级开源框架    2.spring的两大核心        IoC: inverse of control  控制反转:反转是对象 ...

  8. ETO的公开赛T4《对抗水滴》 题解(BY 萌萌哒123456 )

    题意: 给你一个\(n*n\)的矩阵A,其中有\(T\)个元素不为零.定义矩阵内元素\((x,y)\)的能量值 \(E[x][y]=\sum_{i=1}^{x}\sum_{j=1}^{y}[A[i][ ...

  9. git 本地分支与远程仓库分支关联

    当我们从远程仓库项目克隆到本地后,会自动创建本地master分支,并且与远程仓库主分支关联.如果我们需要在本地创建一个分支并且与远程仓库的origin/xxx分支关联,则可以通过以下命令实现 git ...

  10. Java中replace与replaceAll区别

    看门见山 1.java中replace API: replace(char oldChar, char newChar):寓意为:返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所 ...