作者:Antonio Leiva

时间:Apr 25, 2017

原文链接:https://antonioleiva.com/unit-tests-android-kotlin/

当然,Kotlin也允许我们以非常简单的方法进行单元测试,它非常类似我们在Java中进行的那样。

当我们使用想Mockito库时,有一些小的复杂,但是,我们会看到一些技巧使它更容易。

Kotlin的单元测试

虽然,单一测试题目总是存在争议,我不打算在这里对此进行详细说明。

对于我们的例子,只要意识到单元测试是不需要设备进行运行的测试就足够了。IDE能够执行它们,并显示结果,识别出哪些执行了,哪些是失败了。

配置Gradle

你需要加jUnit到你的依赖关系中。在创建项目时,由于这是默认配置,它可能已经包括了。我们还要加Mockito,这在后面要用到它。

 testCompile "junit:junit:4.12"
testCompile "org.mockito:mockito-core:1.10.19"

创建第一个测试

在app/src/test文件夹中(如果它不存在,你可以创建它),你可创建一个叫做MyTest的新类,它类似这样:

 class MyTest {

     @Test
fun testsWork() {
assertTrue(true)
}
}

如你所见,它非常类似我们在Java中使用的那样。

怎样用Mockito

在Kotlin中,虽然你可能发现使用Mockito有些复杂,但是,还是可以像使用其它库一样使用Mockito。这些复杂的点,就是需要我们来解决的。

这是书中的例子

 @Test
fun emptyDatabaseReturnsServerValue() {
val db = Mockito.mock(ForecastDataSource::class.java)
val server = Mockito.mock(ForecastDataSource::class.java)
`when`(server.requestForecastByZipCode(any(Long::class.java), any(Long::class.java)))
.then { ForecastList(0, "city", "country", listOf()) } val provider = ForecastProvider(listOf(db, server))
assertNotNull(provider.requestByZipCode(0, 0))
}

你看,所有的都非常类似。你能够创建自己mock,并在整个代码中无缝地使用它们,你也能够用’MockitoJUnitRunner’和注解。

when字是Kotlin的保留字,所以你需要用反转逗号,甚至你可以用import重命名,给它所需的名称:

 import org.mockito.Mockito.`when` as _when

在你输入mock类型时,问题出现了,它不允许null值。默认情况下,Mockito为mock对象指定null值,这问题迟早会出现的

有个技巧可以用于这个:mockit-kotlin,它不用null了,而是默认的为每个类型给出具体值,来解决这一个问题。另外,它还利用Kotlin的优势提供了其他函数,使事情更简单

另一个问题是,默认情况下,Kotlin的所有类和函数都被关闭,也就是它们不能被扩展。由于不能模拟它们,这是Mockito的问题。

但这已不是问题了,Mockito 2允许模拟最终的对象了。

在后续文章中,我们读到怎样使用它。

一件有趣的小事

Kotlin允许我们比Java更灵活命名函数。如果我们反转逗号,我们可以把想到的任何文字放在其中

这对测试非常有用,其中最重要的是测试名称能够完美地描述了你要做事,以便能够更规范。

因此,你能够有这样的名称的测试:

 @Test fun `test something works as expected`() {
Assert.assertTrue(false)
}

除了提高可读性外,最好的是可以在测试失败时候输出更容易理解的结果。你会看到更清晰错误。

如果在Android项目中使用它,你会看到它显示一个Lint错误,指示Android项目的方法不能有空格。在我的测试中,我没有注意到这可能是一个问题。 Gradle运行它们没有问题,所以你可以添加注释来忽略错误。

无论如何,请记住只用于测试。

结论

虽然理论上,在Java中,我们可以使用的测试工具,在Kotlin中,应该没有问题,但是基于反射和对代码添加null确实给我们带来了一些问题。

Kotlin非常关注无效代码,这在某些情况下可能是个粘滞点。但是,有越来越多的替代方法可以以简单的方式进行的,而与Mockito 2相比,所有这些问题都将消失。

除了这些小缺陷之外,其他一切都与Java一样

想要继续学习Kotlin?只需查阅我写的有关该主题的所有文章

在Android上Kotlin的单元测试(KAD22)的更多相关文章

  1. Android上的单元测试

    Android上的单元测试 http://www.sina.com.cn  2009年12月04日 16:07  IT168.com [IT168 技术文档]任何程序的开发都离不开单元测试来保证其健壮 ...

  2. 在Android上运用Anko和Kotlin开发数据库:SQLite从来不是一件轻松的事(KAD25)

    作者:Antonio Leiva 时间:Mar 30, 2017 原文链接:https://antonioleiva.com/databases-anko-kotlin/ 事实告诉我们:在Androi ...

  3. [Android]Android MVP&依赖注入&单元测试

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5422443.html Android MVP&依赖注入 ...

  4. Android上的MVP:如何组织显示层的内容

    MVP(Model View Presenter)模式是著名的MVC(Model View Controller)模式的一个演化版本,目前它在Android应用开发中越来越重要了,大家也都在讨论关于M ...

  5. 在Android Studio中进行单元测试和UI测试

    本篇教程翻译自Google I/O 2015中关于测试的codelab,掌握科学上网的同学请点击这里阅读:Unit and UI Testing in Android Studio.能力有限,如有翻译 ...

  6. Google Android Studio Kotlin 开发环境配置

    Google 近日开发者大会宣布Kotlin成为Android开发的第一级语言,即Android官方开发语言,可见Google对Kotlin的重视,本文就介绍一下Android Studio下的Kot ...

  7. 在Android上编写模块化项目(翻译)

    来源博客:Wang Jie's Blog 本文链接:http://blog.wangjiegulu.com/2018/02/13/writing_a_modular_project_on_androi ...

  8. 页面结构化在 Android 上的尝试

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/M45DM5Ix7a2fmrsE8VPvxg 作者:b ...

  9. Android上实现MVP模式的途径

    今天我想分享我在Android上实现MVP(Model-View-Presenter)模式的方法.如果你对MVP模式还不熟悉,或者不了解为什么要在Android应用中使用MVP模式,推荐你先阅读这篇维 ...

随机推荐

  1. 在idea配置jetty和创建(包、文件)javaWeb以及Servlet简单实现

    在创建之前要安装好jetty jetty官网链接:https://jettylife.com/ 现在进行创建项目: 需要按照好jdk 现在进行添加jetty 现在进行配置 完成后ok ok 下面警告的 ...

  2. 八数码(IDA*算法)

    八数码 IDA*就是迭代加深和A*估价的结合 在迭代加深的过程中,用估计函数剪枝优化 并以比较优秀的顺序进行扩展,保证最早搜到最优解 需要空间比较小,有时跑得比A*还要快 #include<io ...

  3. LeetCode15.三数之和 JavaScript

    给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重复的三元组. ...

  4. Spring知识点总结(三)之Spring DI

    1. IOC(DI) - 控制反转(依赖注入) 所谓的IOC称之为控制反转,简单来说就是将对象的创建的权利及对象的生命周期的管理过程交由Spring框架来处理,从此在开发过程中不再需要关注对象的创建和 ...

  5. SpingMVC前置控制器过滤问题

    /<servlet-mapping> <servlet-name>Springmvc</servlet-name> <url-pattern>/< ...

  6. java8新特性学习1

    java8增加了不少新特性,下面就一些常见的新特性进行学习... 1.接口中的方法 2.函数式接口 3.Lambda表达式 4.java8内置的四大核心函数式接口 5.方法引用和构造器引用 6.Str ...

  7. c++cmb

    #include<windows.h> #include<bits/stdc++.h> using namespace std; ]; int main() { printf( ...

  8. ABAP术语-Business Object Type

    Business Object Type 原文:http://www.cnblogs.com/qiangsheng/archive/2008/01/10/1033480.html Generic de ...

  9. ABAP术语-Application Server

    Application Server 原文:http://www.cnblogs.com/qiangsheng/archive/2007/12/17/1002777.html Server that ...

  10. Maria-DB

    mysql客户端可用选项: -A, --no-auto-rehash 禁止补全 -u, --user= 用户名,默认为root -h, --host= 服务器主机,默认为localhost -p, - ...