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

时间:2016-08-01 06:31:14

标签: unit-testing mockito kotlin powermock

我对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字符串进行测试。

2 个答案:

答案 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的要求。