如何测试调用Kotlin顶级函数的代码?
问题描述:
我对Kotlin很新。如何测试调用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字符串。
答
我鼓励你用它来封装将通过构造函数的类被注入的界面背后的远程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
}
}
}
另一种方式是注入假Client
由Fuel
使用:
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
}
答
看来“顶级功能”可以看作是变相的静态方法。
从这个角度来看,更好的答案是:不要以这种方式使用它们。这导致高度,直接的耦合;并使您的代码更难以测试。你一定要创建一些接口,你应该使用所有的对象;然后使用依赖注入为您的客户端代码提供一些实现接口的对象。
通过这样做,您也完全摆脱了对Powermock的要求。
嘿恩..你有完整的例子来做到这一点?我试图为我的Kotlin燃料电话编写Junit测试 –
我遵循@ miensol的建议并使用Fuel.testMode()和executeRequest覆盖。 – Boon
如果你可以发布代码片段或发送github链接,它会有很大的帮助吗? –