Как проверить код, который вызывает функции верхнего уровня в Котлине?

Я очень новичок в Котлине.

У меня есть класс, который вызывает функцию верхнего уровня (которая делает 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 для вызова httpGet.

Он добавляет функцию верхнего уровня в String, которая в конечном счете вызывает функцию сопутствующего объекта в 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 } } } 

Другой способ – ввести поддельный Client который будет использоваться 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 } 

Похоже, что «функции верхнего уровня» можно рассматривать как скрытые методы.

И с этой точки зрения лучший ответ: не используйте их таким образом. Это приводит к высокой, прямой связи; и делает ваш код более трудным для тестирования. Вы определенно хотите создать некоторый интерфейс Service, который должны использовать все ваши объекты; а затем используйте инъекцию зависимостей использования для оснащения вашего кода клиента каким-либо объектом, который реализует интерфейс службы .

Поступая таким образом, вы также полностью избавляетесь от требования к Powermock.