2015-01-09 10 views
6

मैं अपने अभिनेता के उदाहरण पर जासूसी करना चाहता हूं, लेकिन इसे आसानी से नए कीवर्ड के साथ नहीं बनाया जा सकता है। मैंने निम्नलिखित समाधान का पता लगाया:अक्का अभिनेता पर मॉकिटो के साथ जासूसी

val testActorSpy = spy(TestActorRef(new TestActor).underlyingActor) 
    val testActorRef = TestActorRef(testActorSpy) 

लेकिन इस तरह से मैं एक अनावश्यक अभिनेता बना देता हूं। क्या कोई क्लीनर समाधान है?

उत्तर

0

तो अक्का अभिनेता प्रणाली की मेरी समझ यह है कि आपको गुणों के माध्यम से ऐसा करना चाहिए?

इस प्रकार प्रोप्स के माध्यम से अभिनेता बनाएं और परीक्षण के दौरान अभिनेता को सिर्फ एक जासूस वापस कर दें।

val testActorRef = TestActorRef(spy(new TestActor)) 
val testActorSpy = testActorRef.underlyingActor 

ध्यान रखें कि underlyingActor जब अभिनेता पुन: प्रारंभ होने को नष्ट कर दिया जाता है:

इस प्रकार यह आप एक परिणाम देना चाहिए। इसलिए यह मजाक करना शायद सबसे अच्छा विकल्प नहीं हो सकता है।

यदि अभिनेता का उपयोग सीधे सिस्टम के माध्यम से किया जाता है तो आप चीजों का परीक्षण करने और थ्रेडेड अंतर्निहित प्रणाली को बाईपास करने में सक्षम हो सकते हैं।

this (जावा के लिए नीचे कोड पेस्ट) देखें।

static class MyActor extends UntypedActor { 
    public void onReceive(Object o) throws Exception { 
    if (o.equals("say42")) { 
     getSender().tell(42, getSelf()); 
    } else if (o instanceof Exception) { 
     throw (Exception) o; 
    } 
    } 
    public boolean testMe() { return true; } 
} 

@Test 
public void demonstrateTestActorRef() { 
    final Props props = Props.create(MyActor.class); 
    final TestActorRef<MyActor> ref = TestActorRef.create(system, props, "testA"); 
    final MyActor actor = ref.underlyingActor(); 
    assertTrue(actor.testMe()); 
} 
+0

एक अभिनेता का एकमात्र सार्वजनिक तरीका 'ऑन रिसीव' होना चाहिए। अन्यथा, अपरिवर्तनीयता जोखिम पर है। इस मामले में, यदि 'testMe' विधि अभिनेता के राज्य को संशोधित करती है, तो उस सिद्धांत का उल्लंघन किया जाता है। 'परीक्षण' निजी होना चाहिए। वसंत के साथ जुनीट परीक्षणों पर निजी तरीकों तक पहुंचने के लिए, 'प्रतिबिंब टेस्टयूटिल' का उपयोग करें। –

+0

इसे तब पैकेज निजी बनाएं। दृश्यता को संशोधित करने के कई तरीके हैं। हमारे कोड बेस पर काम करने वाले हर कोई इस बात से अवगत है कि परिवर्तनीय साझा स्थिति खराब है। और ActorRef सार्वजनिक कार्यों का पर्दाफाश नहीं करता है। तो यह कोई समस्या नहीं है। हमारी दौड़ की स्थिति निजी राज्य पर बंद होने से आई है .. – Alex

+0

आप सही हैं। एक अभिनेता के अंदर सार्वजनिक तरीकों का खुलासा नहीं किया जाता है। मुझे बस एक एहसास है जैसे यह एक कोड गंध है। लेकिन कार्यात्मक परिप्रेक्ष्य से, आप सही हैं। वैसे भी, अगर कोई अन्य अपनी विधियों को निजी रखना चाहता है, तो याद रखें कि उन्हें 'प्रतिबिंब टेस्टयूटिल' के साथ बुलाया जा सकता है। –

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