2010-08-26 27 views
9

मैं मॉकिटो का उपयोग कर रहा हूं और स्केल ऑब्जेक्ट का नकल करने की कोशिश कर रहा हूं।मॉकिंग स्कैला ऑब्जेक्ट

object Sample { } 
//test 
class SomeTest extends Specification with ScalaTest with Mockito { 
    "mocking should succeed" in { 
     val mockedSample = mock[Sample] 
    } 
} 

यह मुझे दो संकलन त्रुटियां देता है।

error: Not found type Sample 
error: could not find implicit value for parameter m: 
scala.reflect.ClassManifest[<error>] 

यदि मैं ऑब्जेक्ट से क्लास में नमूना बदलता हूं तो यह काम करता है। मॉकिटो के साथ स्कैला ऑब्जेक्ट्स का नकल करना संभव है? यदि हां कैसे?

उत्तर

10

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

मुझे नहीं पता कि मॉकिटो वास्तव में क्या कर रहा है, लेकिन मेरे दिमाग में, जो आप पूछ रहे हैं वह स्कैला object के साथ सख्ती से है।

+3

निश्चित रूप से यहां सहमत हैं। आप नकली [नमूना. प्रकार] का प्रयास करने में सक्षम हो सकते हैं, लेकिन मुझे संदेह है कि यह अभ्यास में काम करेगा। मैं अनुशंसा करता हूं कि नमूना कुछ इंटरफ़ेस विशेषता का विस्तार करे और इसे इस तरह से नकल करें। बड़ी समस्या यह है कि यदि आप सिंगलटन नमूने के स्थान पर अपने नकली इंजेक्ट करना चाहते हैं, तो आपको कुछ अच्छा, बुरा, मजेदार परावर्तक जादू करना होगा। यदि आप रुचि रखते हैं, तो हम इसे पोस्ट कर सकते हैं। – jsuereth

+0

मैं दूसरे दिन किसी संबंधित प्रश्न का उत्तर देने के लिए मॉकिटो स्रोत कोड देख रहा था (जो कि किसी कारण से मुझे अब नहीं मिल रहा है) और मुझे लगता है कि "नकली" जेनरेटर में से एक को देखकर याद किया जाता है जो कोशिश करने के बजाए एक विशिष्ट मूल्य देता है वैकल्पिक/वेरिएंट उत्पन्न करने के लिए। –

+0

क्या Powermock के साथ ऐसा करने का कोई तरीका है? अगर मेरे पास एक साथी वस्तु पर एक (प्रभावी रूप से वैश्विक) विधि है, तो यह उचित व्यवहार करना चाहता है; निश्चित रूप से यह रूबी दुनिया में एक आम पैटर्न है। – Korny

6

ध्यान रखें कि आप नकली तरीकों एक object की सकते हैं ताकि वे कार्यों के लिए लिफ्ट में रखें।

case class Person(name: String) 
object Person { 
    def listToJson(lp: List[Person]) = "some actual implementation" 
} 

class ClassUnderTest(listToJson: (List[Person]) => String = Person.listToJson(_)) { 
    def testIt(lp: List[Person]) = listToJson(lp) 
} 

import org.specs._ 
import org.specs.mock.Mockito 
import org.mockito.Matchers._ 

class ASpec extends Specification with Mockito { 
    "a thing" should { 
    "do whatever" in { 
     val m = mock[(List[Person]) => String] 
     val subject = new ClassUnderTest(m) 
     m(Nil) returns "mocked!" 
     subject.testIt(Nil) must_== "mocked! (this will fail on purpose)" 
    } 
    } 
} 

यहां मैं ऑब्जेक्ट व्यक्ति का मज़ाक उड़ा रहा हूं, लेकिन उस पर विधि (जो शायद ओपी का इरादा था)।

परीक्षा परिणाम से पता चलता मजाक काम करता है:

[info] == ASpec == 
[error] x a thing should 
[error] x do whatever 
[error]  'mocked![]' is not equal to 'mocked![ (this will fail on purpose)]' (ASpec.scala:21) 
[info] == ASpec == 

इस बीच, ClassUnderTest के उत्पादन समय उपयोग बस new ClassUnderTest इंजेक्शन समारोह एक डिफ़ॉल्ट तर्क किया जा रहा है के कारण है।

9

मैंने हाल ही में ScalaMock जारी किया है, जो स्कैला के लिए एक मॉकिंग लाइब्रेरी है जो अन्य चीजों के साथ, सिंगलटन (और साथी) वस्तुओं को मॉक कर सकता है।

+4

प्रदान किए गए पृष्ठ पर, एकल भविष्य और सहयोगी वस्तुओं के लिए समर्थन "भविष्य योजना" शीर्षक वाले अनुभाग के तहत घोषित किया गया है। क्या फ्रेमवर्क वर्तमान में उन सुविधाओं का समर्थन करता है? – Zotov

+2

@Zotov, ऐसा लगता है कि मॉकिंग ऑब्जेक्ट्स का समर्थन केवल 2.9 कंपाइलर प्लगइन के उपयोग के साथ ScalaMock2 में उपलब्ध है, जैसा कि इस [ट्यूटोरियल] में बताया गया है (http://paulbutcher.com/2011/11/06/scalamock- क्रमशः/)। ScalaMock3 को कंपाइलर प्लगइन की आवश्यकता नहीं है क्योंकि यह स्कैला 2 पर निर्भर करता है।इसके बजाय 10 मैक्रोज़, लेकिन यह अभी तक स्कैलामोक 2 की सभी सुविधाओं का समर्थन नहीं करता है, जैसा कि इस [ब्लॉग पोस्ट] में उल्लेख किया गया है (http://paulbutcher.com/2012/06/04/scalamock-3-0-preview-release /)। मॉकिंग ऑब्जेक्ट्स इस प्रकार 2.10 में समर्थित नहीं हैं): जहां तक ​​मैं कह सकता हूं, वह अभी भी प्रोजेक्ट की वर्तमान स्थिति प्रतीत होता है। –

+0

यह लाइब्रेरी अभी भी बहुत अच्छी तरह से काम नहीं करती है – danielrvt