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

Posted figozhg

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在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值。默认情况下,Mockitomock对象指定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只需查阅写的有关该主题的所有文章

 

 

 

 

 

 

 

 

 

 

 

 

以上是关于在Android上Kotlin的单元测试(KAD22)的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin 类的 Android 单元测试因“找不到符号类...”而失败

dagger2 和 kotlin 的 Android 单元测试问题

Kotlin-multiplatform:如何执行 iOS 单元测试

Kotlin Multiplatform:如何在 iOS 的单元测试中模拟对象

Kotlin&Mockito单元测试在gradle中失败

Android:带有改造和单元测试的网络调用