¿Cómo se testing el código que llama a funciones de nivel superior en Kotlin?

Soy muy nuevo en Kotlin.

Tengo una class que llama a una function de nivel superior (que hace una llamada http). Estoy intentando escribir testings unitarias para mi class sin tener que salir a la networking.

¿Hay alguna forma de simular / activar powermock / interceptar la llamada de mi class a la function de nivel superior de 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 } } } 

Está utilizando la biblioteca kittinunf / Fuel para la llamada httpGet.

Agrega una function de nivel superior a String que finalmente llama a una function de object complementario en Fuel (Fuel.get ()).

La testing unitaria debe interceptar la llamada a httpGet para que pueda devolver una cadena json para la testing.

Lo animo a encapsular llamadas API remotas detrás de una interfaz que se inyectaría a través del constructor a la class que lo usa:

 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 } } } 

Otra forma es inyectar un Client falso para ser utilizado por 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 } 

Parece que las "funciones de nivel superior" se pueden ver como methods estáticos disfrazados.

Y desde ese punto de vista, la mejor respuesta es: no los use de esa manera. Esto conduce a un acoplamiento alto y directo; y hace que tu código sea más difícil de probar. Definitivamente desea crear algún Servicio de interfaz que todos sus objects deberían estar usando; y luego use la dependency injection de uso para equipar su código de cliente con algún object que implemente la interfaz de service .

Al hacerlo, también se deshace por completo del requisito de Powermock.