zoukankan      html  css  js  c++  java
  • 在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只需查阅写的有关该主题的所有文章

     

     

  • 相关阅读:
    [ 打败 IE 的葵花宝典 ] IE6中css常见BUG全集及解决方案
    js获取URl传递的参数
    几种C#框架提供的数据结构对单值查找的效率比较
    C#Hashtable与Dictionary性能
    Sql server 使用存储过程分页显示
    arrayList使用 与 foreach 使用
    LeetCode 047. 全排列 II DFS
    LeetCode 046. 全排列 dfs 和 dfs_swap
    LeetCode 048. 旋转图像
    LeetCode 040. 组合总和 II 非SET去重
  • 原文地址:https://www.cnblogs.com/figozhg/p/6790376.html
Copyright © 2011-2022 走看看