2013-05-31 11 views
7

Używam skalamock do kpić z klasy, która zawiera niektóre przeciążone metody, ale dostaję pewne błędy.Szyderstwo przeciążonej metody

Na przykład:

val out = mock[PrintStream] 

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

Podnosi się następujący błąd:

[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 

Ale jeśli próbuję użyć:

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

ja też pojawia się błąd:

[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") 

Czy jest jakiś sposób na zrobienie tego w scala? Może przy użyciu innej biblioteki?

Odpowiedz

10

Uważam, że błędy kompilatora, które widzisz, mają związek z tym, że scalamock nie może poprawnie kpić z klasy PrintStream. Jeśli spojrzeć na scalamock scaladocs pojawi się oświadczenie:

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

jako klasa PrintStream jest ani interfejs ani nie ma domyślnego konstruktora, domyślam się, że scalamock nie może prawidłowo drwić go i błędy widzisz są tego skutkiem ubocznym. Jeśli zmienił swój kod aby zamiast używania OutputStream (który jest interfejsem i spełnia tym samym ograniczenia scalamock jest), można zrobić swój przeciążony metody szydząc tak:

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

Osobiście wolę Mockito stosowane w Specs2 jak to robi nie ma takich ograniczeń. Przykładem klasy używając PrintWriter a następnie spec test dla tej klasy, stosując kpiącym z Mockito jest następujący:

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(_)) 
} 

Teraz jest to bardzo trywialny przykład, przy użyciu tylko weryfikacje po badaniu bez Stubbings pre-testów (ponieważ println ma typ zwrotny Unit), ale przynajmniej widać, że Mockito nie cierpi z powodu tych samych ograniczeń co skalamock. Możesz przeczytać więcej o korzystaniu z Mockito za pomocą Specs2 here.

+0

Dobra odpowiedź. Dzięki – simao

Powiązane problemy