是否可以测试这个 Kotlin 类?

Posted

技术标签:

【中文标题】是否可以测试这个 Kotlin 类?【英文标题】:Is it possible to test this Kotlin class? 【发布时间】:2020-05-31 10:09:28 【问题描述】:

我正在尝试为 Kotlin 类 A 编写单元测试用例,并尝试将 test() 方法中存在的 return client() 调用模拟到单元测试 test() 方法:

A.kt kotlin class:
class A (par 1, par 2) : B(par 1, par 2) 
   override fun test(item: String): Boolean 
      return client()
   



B.kt kotlin class:
abstract class B(par 1, par 2) 
    private val client: WebClient by lazy 
        //does something
    
    protected fun client(): WebClient = client

是否可以在 test() 方法中模拟 client() 调用? 如果可能的话怎么做,我应该使用什么库来模拟?

【问题讨论】:

【参考方案1】:

这应该可以使用Mockito 测试框架来实现。但是,模拟从对象方法返回的对象需要模拟对象本身。

val mockOfA = Mockito.mock(A::class)
val mockOfClient = Mockito.mock(WebClient:class)
Mockito.when(mockOfA.test(anyString())).thenReturn(mockOfClient)  // Mind your original snippet return type Boolean from A.test()

如果您的类A 实现了您要在测试场景中测试的内部逻辑,则有两种可能的路径:

创建 Spy 而不是 Mock。模拟只做你明确设置它们做的任何事情。当没有给予任何模拟行为时,Spy 会“退回”到原始实现。 重写A 类,使其依赖ClientProvider 的外部依赖项来获取WebClient 的实例以在方法test() 中返回,并将所述提供者的模拟注入@987654329 类型的对象@在测试期间。

【讨论】:

client().post().uri("some uri").syncBody(body).execute(uri, exception) - 这是完整的,所以它返回一个布尔值

以上是关于是否可以测试这个 Kotlin 类?的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin学习的一些笔记

访问公共类 (Kotlin)

在 Kotlin 中测试非空参数

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

深潜Kotlin协程(十五):测试 Kotlin 协程

深潜Kotlin协程(十五):测试 Kotlin 协程