2013-05-31 7 views
7

मैं स्क्वाडॉक का उपयोग उस वर्ग को नकल करने के लिए कर रहा हूं जिसमें कुछ अधिभारित विधियां हैं लेकिन मुझे कुछ त्रुटियां मिल रही हैं।मॉकिंग अधिभारित विधि

उदाहरण के लिए:

val out = mock[PrintStream] 

(out.print _).expects("cmd \r\n") 

निम्न त्रुटि बढ़ा:

[error] [...]/src/test/scala/chili.scala:19: ambiguous reference to overloaded definition, 
[error] both method print in class PrintStream of type (x$1: String)Unit 
[error] and method print in class PrintStream of type (x$1: Array[Char])Unit 

लेकिन अगर मैं इस्तेमाल करने की कोशिश:

[info] [...]/src/test/scala/chili.scala:19: Unable to resolve overloaded method print 
[info]  (out.print(_: String)).expects("cmd \r\n") 
[info]    ^
[error] [...]/src/test/scala/chili.scala:19: value expects is not a member of String => Unit 
[error]  (out.print(_: String)).expects("cmd \r\n") 
:

(out.print(_: String)).expects("cmd \r\n") 

मैं भी कोई त्रुटि मिलती है

क्या स्कैला में ऐसा करने का कोई तरीका है? शायद एक और पुस्तकालय का उपयोग कर?

उत्तर

10

मेरा मानना ​​है कि आप जो कंपाइलर त्रुटियां देख रहे हैं उन्हें इस तथ्य के साथ करना है कि स्कैलेमॉक PrintStream कक्षा को ठीक से नकल नहीं कर सकता है। scalamock पर नज़र scaladocs आप बयान देखेंगे:

At present, ScalaMock can only mock traits, Java interfaces, and non-final 
classes that define a default constructor 

PrintStream वर्ग के रूप में न तो एक अंतरफलक है और न ही यह डिफ़ॉल्ट निर्माता है, मेरा अनुमान है कि scalamock ठीक से और त्रुटियों आप देख रहे हैं नकली नहीं कर सकता है इसका दुष्प्रभाव हैं। निजी तौर पर

val mockStream = mock[OutputStream]  
(mockStream.write(_:Int)) expects(1) 
(mockStream.write(_:Array[Byte])) expects(Array[Byte](1,2,3)) 

, मैं पसंद Mockito Specs2 के भीतर इस्तेमाल के रूप में यह होता है: आप के बजाय एक OutputStream उपयोग करने के लिए अपने कोड बदल (जो एक अंतरफलक है और इस तरह scalamock के प्रतिबंध को पूरा करती है), तो आप इस तरह मजाक अपने अतिभारित विधि कर सकता है इन प्रकार के प्रतिबंध नहीं हैं। एक वर्ग का एक उदाहरण PrintWriter और का उपयोग कर तो उस वर्ग Mockito साथ मजाक का उपयोग कर के लिए एक परीक्षण कल्पना इस प्रकार है:

import java.io.PrintStream 
import java.io.File 
import org.specs2.mutable.Specification 
import org.specs2.mock.Mockito 

class MockitoExample extends Specification with Mockito{ 
    val mockPrinter = mock[PrintStream] 
    val myPrinter = new MyPrintingClass{ 
    override val printer = mockPrinter 
    } 

    "A request to print and attay of strings" should{ 
    "call println on the PrintStream for each string supplied" in { 
     myPrinter print Array("foo", "bar") 
     there was one(mockPrinter).println("foo") 
     there was one(mockPrinter).println("bar") 
    } 
    } 
} 

class MyPrintingClass{ 
    val printer = new PrintStream(new File("foo.txt")) 

    def print(strings:Array[String]) = strings foreach (printer.println(_)) 
} 

अब यह एक बहुत ही तुच्छ उदाहरण है, कोई पूर्व परीक्षण stubbings के साथ ही बाद परीक्षण सत्यापन का उपयोग करते हुए (क्योंकि println में Unit रिटर्न प्रकार है), लेकिन कम से कम आप देख सकते हैं कि मॉकिटो स्कैमॉकॉक के समान प्रतिबंधों से ग्रस्त नहीं है। आप स्पीक्स 2 here के साथ मॉकिटो का उपयोग करने के बारे में अधिक पढ़ सकते हैं।

+0

अच्छा जवाब। धन्यवाद – simao

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