2010-06-24 18 views
13

मैं स्कैला अभिनेता से बाहर निकलने के लिए कैसे प्रतीक्षा करूं()? मैंने यूनिट टेस्ट में दो अभिनेताओं की स्थापना की, और उन्हें शुरू करने के लिए कुछ संदेश भेज दिए। वे कुछ संदेश आगे और आगे भेजते हैं और अंततः दोनों कॉल बाहर निकलें()। गुजरने से पहले दोनों अभिनेताओं को खत्म करने के लिए मैं अपना यूनिट टेस्ट इंतजार कैसे करूं?बाहर निकलने के लिए एक अभिनेता की प्रतीक्षा करें()

उत्तर

7

यदि आप पहले से ही अभिनेताओं के बीच आदान-प्रदान संदेशों की संख्या जानते हैं, तो आप संदेश की गिनती का ट्रैक रखने के लिए java.util.concurrent.CountDownLatch का उपयोग कर सकते हैं। अभिनेताओं में, संदेश के प्रत्येक प्रसंस्करण के बाद,

latch.countDown() 

और अपने मुख्य थ्रेड में क्या

latch.await() 

यह आपके मुख्य थ्रेड प्रतीक्षा कर देगा तक कुंडी की गिनती शून्य हो जाने पर है।

यदि आप पहले से संदेशों की गिनती नहीं जानते हैं, लेकिन एक शर्त है जो खत्म करने का संकेत देती है, तो आप java.util.concurrent.locks.Condition का उपयोग कर सकते हैं। अभिनेताओं में, जब अपने शर्त पूरी होने,

if (conditionSatisfied) 
    condition.signal() 

और अपने मुख्य थ्रेड में क्या

while (!conditionSatisfied) 
condition.await() 

यह प्रतीक्षा करने के लिए जब तक शर्त पूरी होने से करते हैं।

विवरण के लिए CountDownLatch और Condition के javadocs देखें।

this GistCondition का उपयोग करने के उदाहरण के लिए देखें।

+1

मैं उलटी गिनती() बस से पहले कर सकते थे बाहर निकलें() और केवल 1 तक गिनती है। यह अनावश्यक लगता है हालांकि दोनों तरीकों को हमेशा एक साथ बुलाया जाएगा। –

+0

मुझे यह नहीं मिला। आप चाहते हैं कि मुख्य धागा कलाकारों के समाप्त होने तक प्रतीक्षा करें, है ना? यही वही है जो 'प्रतीक्षा()' कॉल करेगा। –

+0

इसका मतलब है कि मुझे उत्पादन कोड (अभिनेता) को पूरी तरह से जुनीट टेस्ट (अभिनेताओं पर इंतजार) के लिए एक लच या शर्त जोड़नी है। –

2

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

<entity state> must eventually(10, 1.second)(be(<state>)) // there will be 10 retires every second, and if the state will be different, exception is thrown 
+1

इससे इकाई परीक्षण एक सेकंड के दसवें हिस्से को चलाने के लिए चलाएगा जो कि बहुत धीमा है। –

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