2016-08-01 10 views
6

Jestem bardzo nowy w Kotlin.Jak przetestować kod wywołujący funkcje najwyższego poziomu w Kotlin?

Mam klasę, która wywołuje funkcję najwyższego poziomu (która wywołuje http). Próbuję napisać testy jednostkowe dla mojej klasy bez jej wysyłania do sieci.

Czy istnieje sposób na fałszywe/powermock/przechwytywanie połączenia z mojej klasy do funkcji najwyższego poziomu 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 
     } 
    } 
} 

Jest używając kittinunf/Fuel library dla wywołania HttpGet.

Dodaje funkcję najwyższego poziomu do String, która ostatecznie wywołuje funkcję obiektu towarzyszącego w Fuel (Fuel.get()).

Test urządzenia musi przechwycić połączenie do httpGet, aby móc zwrócić ciąg jsonów do testu.

+0

Hej Boon .. Czy masz pełny przykład, aby to zrobić? Próbuję napisać testy Junit dla moich połączeń paliwowych Kotlin –

+0

Podążałem za sugestią @ miensol i użyłem Fuel.testMode() i nadpisania executeRequest. – Boon

+0

będzie bardzo pomocne, jeśli możesz opublikować fragment kodu lub wysłać link do github? –

Odpowiedz

6

Zachęcam do hermetyzacji zdalnych wywołań API za jeden interfejs, który będzie wstrzykiwany przez konstruktora do klasy używając go:

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

Innym sposobem jest wstrzykiwać fałszywe Client być wykorzystywane przez 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 
} 
+0

Dziękuję bardzo za wskazówkę! – Boon

+1

Jak mogę wykonać ten sam fałszywy zastrzyk klienta za pomocą Java? Myślę, że dokumentacja dotycząca paliwa nie jest wystarczająco jasna w tych przypadkach. – Yajairo87

4

Wygląda na to, że "funkcje najwyższego poziomu" można uznać za ukryte w statycznych metodach.

I z tego punktu widzenia lepszą odpowiedzią jest: nie używaj ich w taki sposób. Prowadzi to do wysokiego, bezpośredniego sprzężenia; i sprawia, że ​​Twój kod jest trudniejszy do przetestowania. Zdecydowanie chcesz utworzyć interfejs Service, którego wszystkie obiekty powinny używać; a następnie użyj wtyczki zależności użycia, aby wyposażyć swój kod klienta w obiekt implementujący interfejs Service.

W ten sposób pozbędziesz się całkowicie wymogu Powermock.

Powiązane problemy