2017-11-08 33 views
13

देरी के साथ एक कोटलिन कोरआउटिन का परीक्षण करने वाला यूनिट मैं delay() का उपयोग करने वाले कोटलिन कोरोटाइन का परीक्षण करने की कोशिश कर रहा हूं। यूनिट टेस्ट के लिए मुझे delay() पर परवाह नहीं है, यह सिर्फ परीक्षण को धीमा कर रहा है। मैं परीक्षण को किसी भी तरह से चलाने के लिए चाहता हूं जो वास्तव में देरी नहीं करता है जब delay() कहा जाता है।यूनिट

मैं एक कस्टम संदर्भ में जो प्रतिनिधियों CommonPool के लिए प्रयोग कर coroutine चलाने का भी प्रयास:

class TestUiContext : CoroutineDispatcher(), Delay { 
    suspend override fun delay(time: Long, unit: TimeUnit) { 
     // I'd like it to call this 
    } 

    override fun scheduleResumeAfterDelay(time: Long, unit: TimeUnit, continuation: CancellableContinuation<Unit>) { 
     // but instead it calls this 
    } 

    override fun dispatch(context: CoroutineContext, block: Runnable) { 
     CommonPool.dispatch(context, block) 
    } 
} 

मुझे उम्मीद थी मैं बस अपना संदर्भ के delay() विधि से लौटा सकता है, लेकिन इसके बजाय यह मेरी scheduleResumeAfterDelay() विधि कॉल कर रहा है, और मैं डॉन ' टी को डिफ़ॉल्ट शेड्यूलर को कैसे प्रतिनिधिाना है, यह नहीं पता।

+0

क्या आप देरी टाइमआउट कॉन्फ़िगर करने योग्य नहीं कर सकते हैं ताकि आपके परीक्षण में आप एक बहुत छोटा चुन सकें ?! – s1m0nw1

+0

@ s1m0nw1 हां, लेकिन मेरे पास एक सामान्य समाधान होगा, और इस तरह मेरे कोड को संशोधित करने की आवश्यकता नहीं है। –

+0

@eoinmullan, क्या आप इसके लिए न्यूनतम गिट प्रोजेक्ट साझा कर सकते हैं? –

उत्तर

7

आप किसी देरी नहीं करना चाहते हैं, क्यों आप बस अनुसूची कॉल में निरंतरता ?:

class TestUiContext : CoroutineDispatcher(), Delay { 
    override fun scheduleResumeAfterDelay(time: Long, unit: TimeUnit, continuation: CancellableContinuation<Unit>) { 
     continuation.resume(Unit) 
    } 

    override fun dispatch(context: CoroutineContext, block: Runnable) { 
     //CommonPool.dispatch(context, block) // dispatch on CommonPool 
     block.run() // dispatch on calling thread 
    } 
} 

इस तरह delay() किसी विलंब के फिर से शुरू होगा फिर से शुरू नहीं है। ध्यान दें कि यह अभी भी देरी से निलंबित कर देता है, तो अन्य coroutines अभी भी चल सकते हैं (yield()) की तरह बिना किसी देरी के

@Test 
fun `test with delay`() { 
    runBlocking(TestUiContext()) { 
     launch { println("launched") } 
     println("start") 
     delay(5000) 
     println("stop") 
    } 
} 

चलाता है और प्रिंट:

start 
launched 
stop 

संपादित करें:

आप जहां नियंत्रित कर सकते हैं निरंतरता dispatch फ़ंक्शन को अनुकूलित करके चलाया जाता है।

+0

और 'प्रेषण()' केवल 'block.run()' हो सकता है, जो मुख्य धागे में निष्पादन रखता है। –

+0

सच है, और यह परीक्षण के लिए समझ में आ सकता है, हालांकि वह इसे सामान्यपूल का उपयोग करना चाहता था। – bj0

+0

मैं ओपी हूं, और मैं इसे एक ही थ्रेड का उपयोग करना चाहता हूं। परिवर्तन करें और मैं आपका जवाब स्वीकार करूंगा। –