在Android上Kotlin的单元测试(KAD22)
时间: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?只需查阅我写的有关该主题的所有文章。