2013-05-31 27 views
7

Bazı aşırı yüklenmiş yöntemler içeren bir sınıfla alamamak için scalamock kullanıyorum ancak bazı hatalar alıyorum. ÖrneğinAşırı yüklü yöntem aşımı

:

val out = mock[PrintStream] 

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

aşağıdaki hatayı Artırdı:

[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 

Ama kullanmaya çalışırsanız:

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

Ben de bir hata alıyorum

Bunu scalada yapmanın bir yolu var mı? Belki başka bir kütüphane kullanıyor?

cevap

10

Gördüğünüz derleyici hatalarının, scalamock'un PrintStream sınıfını düzgün bir şekilde alamadığı gerçeği ile ilgili olması gerektiğine inanıyorum. Eğer deyimi göreceksiniz scaladocs scalamock bakmak ise: PrintStream sınıfa olarak

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

bir arayüz ne olduğunu ne de varsayılan kurucu var, benim tahminim scalamock düzgün ve Gördüğünüz hataları alay edemezler Bunun bir yan etkisi vardır. Bunun yerine bir OutputStream uygulamak için kodunuzu değişti (bir arayüz olan ve dolayısıyla scalamock en kısıtlamaları karşılayan), bu gibi alay sizin aşırı yöntemi yapabilirdi:

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

Şahsen ben öyle Mockito Specs2 içinde kullanılan tercih Bu tür kısıtlamalara sahip değil. PrintWriter ve kullanan bir sınıfın bir örneği daha sonra şöyle Mockito alay kullanarak o sınıf için bir test spec olduğunu:

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

Şimdi bu bir ön-test Stubbings sadece test sonrası doğrulamaları kullanarak, çok önemsiz bir örnektir (println'un bir Unit dönüş türü vardır), ancak en azından Mockito'nun scalamock ile aynı kısıtlamalardan etkilenmediğini görebilirsiniz. Mockito'yu Specs2 here ile kullanma hakkında daha fazla bilgi edinebilirsiniz.

+0

İyi cevap. Teşekkürler – simao

İlgili konular