2011-12-19 17 views
63

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

public class InjectorBehaviour { 
    @Test 
    public void shouldInjectCorrectTypes() { 
     Injector injector = Guice.createInjector(new ModuleImpl()); 
     House house = injector.getInstance(House.class); 

     assertTrue(house.door() instanceof WoodenDoor); 
     assertTrue(house.window() instanceof BambooWindow); 
     assertTrue(house.roof() instanceof SlateRoof); 
    } 
} 

लेकिन मैं एक समस्या ScalaTest के साथ एक ही कर रही है:

class InjectorSpec extends Spec { 
    describe("An injector") { 
     it("should inject the correct types") { 
      val injector = Guice.createInjector(new ModuleImpl) 
      val house = injector.getInstance(classOf[House]) 

      assert(house.door instanceof WoodenDoor) 
      assert(house.window instanceof BambooWindow) 
      assert(house.roof instanceof SlateRoof) 
     } 
    } 
} 

यह शिकायतों कि मूल्य instanceof दरवाजा/खिड़की का सदस्य नहीं है/रूफ। क्या मैं स्कैला में इस तरह के उदाहरण का उपयोग नहीं कर सकता?

उत्तर

91

स्कैला जावा नहीं है। स्कैला में ऑपरेटर instanceof नहीं है इसके बजाय इसमें isInstanceOf[Type] नामक एक पैरामीट्रिक विधि है।

+2

अच्छी तरह से, यह वास्तव में प्रश्न का उत्तर नहीं देता है। ScalaTest में टाइप चेक के लिए अंतर्निहित समर्थन है। @ मार्टिन-जी – maasg

+3

का उत्तर देखें मेरा उत्तर लगभग 5 वर्ष पुराना है। 'इंस्टेंस को @ मार्टिन-जी द्वारा दिखाए गए एक [कुछ क्लास] तकनीक को वापस लेना चाहिए (जैसा कि वह सही ढंग से बताता है)। यदि आप इसके बारे में तकनीकी बनना चाहते हैं, तो मेरा जवाब पूरी तरह से ओपी के प्रश्न का उत्तर देता है, जो है: "क्या मैं स्कैला में इस तरह के उदाहरण का उपयोग नहीं कर सकता?"। दोनों दृष्टिकोण आज के रूप में काम करते हैं और इस प्रकार दोनों सही जवाब हैं। आपका दिन शुभ हो। – agilesteel

+0

अगर यह टाइप करें तो यह कैसे करें? – Lobo

28

यदि आप कम जुनीट-एस्क्यू बनना चाहते हैं और यदि आप स्कैलाटेस्ट के मैचर्स का उपयोग करना चाहते हैं, तो आप अपना खुद का प्रॉपर्टी मैचर लिख सकते हैं जो टाइप (बार टाइप एरर) के लिए मेल खाता है।

मैं इस सूत्र पाया काफी उपयोगी होने के लिए: http://groups.google.com/group/scalatest-users/browse_thread/thread/52b75133a5c70786/1440504527566dea?#1440504527566dea

फिर आप की तरह दावे लिख सकते हैं: isInstanceOf [प्रकार] के बारे में

house.door should be (anInstanceOf[WoodenDoor]) 
बजाय

assert(house.door instanceof WoodenDoor) 
+0

+1 यह बहुत अच्छा लग रहा है, और गैर-प्रोग्रामिंग लोगों के लिए भी समझ में आता है (मानते हैं कि उन्हें पता है कि एक उदाहरण क्या है :-))। – helpermethod

+0

यदि सिंटैक्स चीनी आपके बाद है, तो कुछ रिफैक्टरिंग के साथ आप घर लिखने में सक्षम हो सकते हैं। घर होना चाहिए (बनाया गया [लकड़ी]) या घर। घर होना चाहिए (बनाया [बांस])। –

+1

भी https://groups.google देखें।com/d/topic/scalatest-users/HeOKgs5PC2o/चर्चा –

12

वर्तमान जवाब और जूनिट सलाह अच्छी है लेकिन मैं एक चीज जोड़ना चाहता हूं (उन लोगों के लिए जो इस पृष्ठ पर गैर-जूनिट से संबंधित क्षमता में हैं)। कई मामलों में स्कैला पैटर्न मिलान आपकी आवश्यकताओं के अनुरूप होगा। मैं उन मामलों में इसकी अनुशंसा करता हूं क्योंकि यह आपको मुफ्त में टाइपकास्टिंग देता है और त्रुटि के लिए कम जगह छोड़ देता है।

उदाहरण:

OuterType foo = blah 
foo match { 
    case subFoo : SubType => { 
    subFoo.thingSubTypeDoes // no need to cast, use match variable 
    } 
    case subFoo => { 
    // fallthrough code 
    } 
} 
+0

स्कैलाटेस्ट में पैटर्न मिलान का परीक्षण करने का अनुशंसित तरीका 'foo match' के बजाय 'अंदर (foo)' का उपयोग करना है। देखें http://www.scalatest.org/user_guide/using_matchers#matchingAPattern –

2

Guillaume के ScalaTest चर्चा संदर्भ (और एक अन्य चर्चा जेम्स मूर द्वारा से जुड़े) दो तरीकों में समेकन, ScalaTest 2.x और स्काला 2.10 (बल्कि प्रकट की तुलना में ClassTag उपयोग करने के लिए) के लिए अद्यतन:

import org.scalatest.matchers._ 
import scala.reflect._ 

def ofType[T:ClassTag] = BeMatcher { obj: Any => 
    val cls = classTag[T].runtimeClass 
    MatchResult(
    obj.getClass == cls, 
    obj.toString + " was not an instance of " + cls.toString, 
    obj.toString + " was an instance of " + cls.toString 
) 
} 

def anInstanceOf[T:ClassTag] = BeMatcher { obj: Any => 
    val cls = classTag[T].runtimeClass 
    MatchResult(
    cls.isAssignableFrom(obj.getClass), 
    obj.getClass.toString + " was not assignable from " + cls.toString, 
    obj.getClass.toString + " was assignable from " + cls.toString 
) 
} 
36

Scalatest 2.2.x के साथ (शायद भी पहले) आप का उपयोग कर सकते हैं: anInstance mustBe an[SomeClass]

+3

स्कैलास्टेस्ट – maasg

+4

के हाल के संस्करणों पर यह अनुशंसित दृष्टिकोण है 'ए [टाइप]' भी उपलब्ध है ताकि आप व्याकरणिक रूप से सही हो सकें;) – Samuel

+0

मैं इसकी तलाश कर रहा था ! :) – Atais

0

मैं 2.11.8 का उपयोग coll साथ दावा करने के लिए ections। नया वाक्यविन्यास निम्नानुसार है:

val scores: Map[String, Int] = Map("Alice" -> 10, "Bob" -> 3, "Cindy" -> 8) 
scores shouldBe a[Map[_, _]] 
+1

मिटाने के कारण आप 'मानचित्र' के प्रकार पैरामीटर की जांच नहीं कर सकते हैं। जो आपने लिखा है वह 'स्कोर' लिखना जैसा ही होना चाहिए [मानचित्र [_, _]] '। यहां उल्लेख किया गया है: http://www.scalatest.org/user_guide/using_matchers#checkingAnObjectsClass –