在Android上Kotlin的单元测试(KAD22)

作者:Antonio Leiva

时间:Apr 25, 2017

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

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

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

Kotlin的单元测试

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

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

配置Gradle

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

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

创建第一个测试

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

1 class MyTest {
2
3     @Test
4     fun testsWork() {
5         assertTrue(true)
6     }
7 }

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

怎样用Mockito

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

这是书中的例子

 1 @Test
 2 fun emptyDatabaseReturnsServerValue() {
 3     val db = Mockito.mock(ForecastDataSource::class.java)
 4     val server = Mockito.mock(ForecastDataSource::class.java)
 5     `when`(server.requestForecastByZipCode(any(Long::class.java), any(Long::class.java)))
 6             .then { ForecastList(0, "city", "country", listOf()) }
 7
 8     val provider = ForecastProvider(listOf(db, server))
 9     assertNotNull(provider.requestByZipCode(0, 0))
10 }

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

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

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

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

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

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

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

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

一件有趣的小事

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

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

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

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

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

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

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

结论

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

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

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

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

时间: 2024-10-10 21:33:23

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

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

作者:Antonio Leiva 时间:Mar 30, 2017 原文链接:https://antonioleiva.com/databases-anko-kotlin/ 事实告诉我们:在Android中编写数据库是相当无聊的. 使用SQLite时,所需的所有模板在当今世界上都不是一件最令人愉快的事情. 所幸的是,在最新一次Google I / O会议上,它们宣布的其中一项事项(称其为:Room),就是为简化这项工作,开发出足够的库. 然而,运用Anko,我们仍可以继续像使用低级别框架一样工作,

Google Android Studio Kotlin

Google Android Studio Kotlin 开发环境配置 Google 近日开发者大会宣布Kotlin成为Android开发的第一级语言,即Android官方开发语言,可见Google对Kotlin的重视,本文就介绍一下Android Studio下的Kotlin开发环境配置以及示例程序. 由于楼主是C++程序员,不是Java出身,也不太懂移动端的Android开发,业余时间想学习Android移动端开发,但是楼主又不想学Java,该如何是好呢(O(∩_∩)O哈哈~),正好Kotl

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

MVP(Model View Presenter)模式是著名的MVC(Model View Controller)模式的一个演化版本,目前它在Android应用开发中越来越重要了,大家也都在讨论关于MVP的理论,只是结构化的资料非常少.这就是我写这篇博客的原因,我想鼓励大家多参与讨论,然后把MVP模式运用在项目开发中. 什么是MVP? MVP模式可以分离显示层和逻辑层,所以功能接口如何工作与功能的展示可以实现分离,MVP模式理想化地可以实现同一份逻辑代码搭配不同的显示界面.首先要澄清就是MVP不

android产品研发(十九)-->android studio中的单元测试

转载请标明出处:一片枫叶的专栏 上一篇文章中我们讲解了webview中问题集锦,讲解了webview的性能优化.webview种入Cookie信息.activity退出的时候清除webview信息报错.如何通过java代码和js代码相互交互.webview如何下载文件以及腾讯的X5浏览服务等知识,这些都是我在使用webview中遇到的问题,难点,实践等,更多关于这些问题的说明,可以参考我的:android产品研发(十八)–>webview趟过的坑 本文我们将讲解如何在android studio

Android上的MVP模式

什么是MVP? MVP模式可以分离显示层和逻辑层,所以功能接口如何工作与功能的展示可以实现分离,MVP模式理想化地可以实现同一份逻辑代码搭配不同的显示界面.首先要澄清就是MVP不是一个结构化的模式,它只是负责显示层而已,任何时候都可以在自己的项目结构中使用MVP模式. 为什么要使用MVP? 我们知道在Android上逻辑接口和数据存取是紧耦合的,这个问题可以看看CursorAdapter这个例子,它既融合了适配器,同时也有显示的成分,而cursor很大程度上应该是数据数据存取层的. 对于一个可扩

Android上实现MVP模式的途径

今天我想分享我在Android上实现MVP(Model-View-Presenter)模式的方法.如果你对MVP模式还不熟悉,或者不了解为什么要在Android应用中使用MVP模式,推荐你先阅读这篇维基百科文章和这篇博客. 使用Activity和Fragment作为View合适么? 目前,在很多使用了MVP模式的Android项目中,主流做法是将Activity和Fragment作为视图层来进行处理.而Presenters通常是通过继承被视图层实例化或者注入的对象来得到的.我认可这种方式可以节省

如何正确的在 Android 上使用协程 ?

前言 你还记得是哪一年的 Google IO 正式宣布 Kotlin 成为 Android 一级开发语言吗?是 Google IO 2017 .如今两年时间过去了,站在一名 Android 开发者的角度来看,Kotlin 的生态环境越来越好了,相关的开源项目和学习资料也日渐丰富,身边愿意去使用或者试用 Kotlin 的朋友也变多了.常年混迹掘金的我也能明显感觉到 Kotlin 标签下的文章慢慢变多了(其实仍然少的可怜).今年的 Google IO 也放出了 Kotlin First 的口号,许多

Unity3D之AssetBundle学习:Android上运行笔记

路径统一 在Android上加载StreamingAssets文件夹下的AssetBundle文件,首先需要对加载地址进行处理,注意PC.Android和IOS的地址不一致需要针对不同的平台不同的处理,通用代码如下: 1 //统一不同平台下 StreamingAssets 路径 2 public static readonly string STREAMING_ASSETS_PATH = 3 #if UNITY_ANDROID 4 "jar:file:///" + Applicatio

SharePanel – Android上简单的一键分享,可分享到微信QQ和新浪微博

SharePanel – Android上简单的一键分享,可分享到微信QQ和新浪微博 SharePanel Android上简单的一键分享可分享到微信QQ和新浪微博 简介 效果图 代码块 简介 最近在写一个小程序长微博工具,效果就是编辑长微博,然后一键分享到微信.QQ和新浪微博. 一开始是想直接用Intent.createChooser(target, title)来做,后来一想,这样做不是很好啊,会有许多乱七八糟的应用弹出来,我想优先分享到微信.QQ和微博,于是找了点资料,将一键分享这个部分做