2016-08-01 6 views
6

मैं कोटलिन के लिए बहुत नया हूं।कोटलिन में शीर्ष स्तर के कार्यों को कॉल करने वाले कोड का परीक्षण कैसे करें?

मैं एक वर्ग एक शीर्ष स्तर समारोह (जो एक 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 
     } 
    } 
} 

यह httpGet कॉल के लिए kittinunf/Fuel library उपयोग कर रहा है।

यह है कि अंततः ईंधन में एक साथी वस्तु फ़ंक्शन को कॉल स्ट्रिंग के लिए एक शीर्ष स्तर समारोह कहते हैं (Fuel.get())।

इकाई परीक्षण httpGet करने के लिए कॉल अवरोधन करने ताकि मैं परीक्षण के लिए एक json स्ट्रिंग लौट सकते हैं की जरूरत है।

+0

अरे बून .. क्या आपके पास ऐसा करने के लिए पूरा उदाहरण है? मैं अपने Kotlin ईंधन के लिए JUnit परीक्षण लिखने के लिए कोशिश कर रहा हूँ कॉल –

+0

मैं @ miensol के सुझाव और इस्तेमाल Fuel.testMode() और executeRequest ओवरराइड का पालन किया। – Boon

+0

यदि आप कोड स्निपेट पोस्ट कर सकते हैं या एक जिथब लिंक भेज सकते हैं तो यह बहुत मददगार होगा? –

उत्तर

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

एक और तरीका है Fuel द्वारा इस्तेमाल किया जा करने के लिए एक नकली Client सुई के लिए है:

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

मैं जावा के साथ एक ही नकली ग्राहक इंजेक्शन कैसे कर सकता हूं? मुझे लगता है कि इस मामले के लिए ईंधन दस्तावेज पर्याप्त नहीं है। – Yajairo87

4

ऐसा लगता है कि "शीर्ष स्तर के कार्यों" को छिपाने में स्थैतिक तरीकों के रूप में देखा जा सकता है।

और देखने के उस बिंदु से, बेहतर जवाब है: उन्हें इस तरह से उपयोग नहीं करते। यह उच्च, प्रत्यक्ष युग्मन की ओर जाता है; और आपके कोड को परीक्षण करने में कठोर बनाता है। आप निश्चित रूप से कुछ इंटरफेस सेवा बनाना चाहते हैं जो आपकी सभी वस्तुओं का उपयोग करना चाहिए; और उसके बाद अपने क्लाइंट कोड को कुछ ऑब्जेक्ट के साथ लैस करने के लिए उपयोग निर्भरता इंजेक्शन का उपयोग करें जो सेवा इंटरफ़ेस लागू करता है।

ऐसा करके, आप भी पूरी तरह से Powermock को आवश्यकता से छुटकारा पाने के।

संबंधित मुद्दे