Unit testing 如何测试调用Kotlin中顶级函数的代码?

Unit testing 如何测试调用Kotlin中顶级函数的代码?,unit-testing,mockito,kotlin,powermock,Unit Testing,Mockito,Kotlin,Powermock,我对科特林很陌生 我有一个类,它调用顶级函数(进行http调用)。我正在尝试为我的类编写单元测试,而不让它进入网络 有没有办法mock/powermock/intercept从我的类到Kotlin顶级函数的调用 class MyClass { fun someMethod() { // do some stuff "http://somedomain.com/some-rest/action".httpGet(asList("someKey" to "so

我对科特林很陌生

我有一个类,它调用顶级函数(进行http调用)。我正在尝试为我的类编写单元测试,而不让它进入网络

有没有办法mock/powermock/intercept从我的类到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
        }
    }
}
它正在为httpGet调用使用

它向字符串中添加了一个顶级函数,该字符串最终调用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 
        }
    }
}
似乎“顶级函数”可以被视为伪装的静态方法

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


通过这样做,您还完全摆脱了对Powermock的需求

嘿,布恩。。你有完整的例子来做这件事吗?我正在尝试为我的Kotlin fuel调用编写Junit测试。我遵循@miensol的建议,使用了fuel.testMode()和executeRequest重写。如果你能发布代码片段或发送github链接,这将非常有帮助。我如何用Java做同样的伪客户端注入?我认为燃料文件对于这种情况来说不够清楚。
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
}