2016-08-01 66 views
6

我对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字符串。

+0

嘿恩..你有完整的例子来做到这一点?我试图为我的Kotlin燃料电话编写Junit测试 –

+0

我遵循@ miensol的建议并使用Fuel.testMode()和executeRequest覆盖。 – Boon

+0

如果你可以发布代码片段或发送github链接,它会有很大的帮助吗? –

回答

6

我鼓励你用它来封装将通过构造函数的类被注入的界面背后的远程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 
} 
+0

非常感谢你的指针! – Boon

+1

我怎么能用Java做同样的假客户端注入?我认为Fuel文档对于这种情况还不够清楚。 – Yajairo87

4

看来“顶级功能”可以看作是变相的静态方法。

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

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