我对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字符串进行测试。
答案 0 :(得分:8)
我鼓励您将远程API调用封装在一个接口后面,该接口将通过构造函数注入到使用它的类中:
$xml_post_string = '<?xml version="1.0" encoding="utf-8"
另一种方法是注入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
答案 1 :(得分:4)
似乎&#34;顶级功能&#34;可以看作伪装的静态方法。
从这个角度来看,更好的答案是:不要以这种方式使用它们。这导致高,直接耦合;并使您的代码更难测试。您肯定想要创建一些所有对象应该使用的接口 Service ;然后使用依赖注入来为您的客户端代码配备一些实现 Service 接口的对象。
通过这样做,您也完全摆脱了对Powermock的要求。