【问题标题】:How to test code that calls top level functions in Kotlin?如何测试在 Kotlin 中调用顶级函数的代码?
【发布时间】:2016-12-06 03:30:56
【问题描述】:

我对 Kotlin 很陌生。

我有一个调用顶级函数(进行 http 调用)的类。我正在尝试为我的班级编写单元测试,而无需将其发布到网络上。

有没有办法模拟/powermock/拦截从我的班级到 Kotlin 顶级函数的调用?

class MyClass {
    fun someMethod() {
        // do some stuff
        "http://somedomain.com/some-rest/action".httpGet(asList("someKey" to "someValue")).responseString { (request, response, result) ->
            // some processing code
        }
    }
}

它使用kittinunf/Fuel library 进行httpGet 调用。

它向 String 添加了一个顶级函数,该函数最终调用 Fuel 中的伴随对象函数 (Fuel.get())。

单元测试需要拦截对httpGet的调用,以便我可以返回一个json字符串进行测试。

【问题讨论】:

  • Hey Boon.. 你有完整的例子吗?我正在尝试为我的 Kotlin 燃料调用编写 Junit 测试
  • 我按照@miensol 的建议使用了Fuel.testMode() 和executeRequest 覆盖。
  • 如果您可以发布代码 sn-p 或发送 github 链接将有很大帮助?

标签: unit-testing mockito kotlin powermock


【解决方案1】:

我鼓励您将远程 API 调用封装在一个接口后面,该接口将通过构造函数注入到使用它的类中:

class ResponseDto
interface SomeRest {
    fun action(data:Map<String,Any?>): ((ResponseDto)->Unit)->Unit
}
class FuelTests(val someRest: SomeRest) {
    fun callHttp(){
        someRest.action(mapOf("question" to "answer")).invoke { it:ResponseDto ->
            // do something with response 
        }
    }
}

另一种方法是注入一个假的ClientFuel 使用:

FuelManager.instance.client = object: Client {
    override fun executeRequest(request: Request): Response {
        return Response().apply {
            url = request.url
            httpStatusCode = 201
        }
    }
}

Fuel.testMode()

"http://somedomain.com/some-rest/action".httpGet(listOf()).responseString { request, response, result ->
    print(response.httpStatusCode) // prints 201
}

【讨论】:

  • 我怎样才能用 Java 做同样的假客户端注入?我认为对于这种情况,Fuel 文档不够清楚。
【解决方案2】:

似乎“顶级函数”可以看作是变相的静态方法。

从这个角度来看,更好的答案是:不要以这种方式使用它们。这会导致高度直接的耦合;并使您的代码更难测试。你肯定想创建一些你的所有对象都应该使用的接口Service;然后使用依赖注入为您的客户端代码配备一些实现 Service 接口的对象。

通过这样做,您也完全摆脱了对 Powermock 的要求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2019-07-18
    • 1970-01-01
    相关资源
    最近更新 更多