2013-05-31 9 views
7

オーバーロードされたメソッドを含むクラスを模擬するためにscalamockを使用していますが、いくつかのエラーが発生しています。例えばオーバーロードされたメソッドを模擬します

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 

をしかし、私は使用しようとします

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

私もエラーが出ます:

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

スカラーでこれを行う方法はありますか?たぶん別のライブラリを使用していますか?

答えて

10

あなたが見ているコンパイラのエラーは、scalamockがPrintStreamクラスを正しく模倣できないという事実と関係していると思います。次の文が表示されますscalamock scaladocsを見れば:

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

PrintStreamクラスがインタフェースも、それはデフォルトコンストラクタを持たないでもないとして、私の推測ではscalamockが正しく、あなたが見ているエラーを模擬することができないということですその副作用です。あなたは(これはインターフェイスであるため、scalamockの制限を満たしている)の代わりにOutputStreamを使用するようにコードを変更した場合、あなたはこのようにモックあなたのオーバーロードされた方法で行うことができます。個人的に

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

を、私はそれがないようMockitoがSpecs2内で使用されることを好みますこれらの種類の制限はありません。次のようにMockitoとからかっ使用して、その後PrintWriterを使用して、クラスの例と、そのクラスのテスト仕様は次のとおりです。

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の戻り値があるので)少なくとも、Mockitoはscalamockと同じ制限を受けていないことがわかります。 Specs2 hereでMockitoを使用する方法について詳しく読むことができます。

+0

ありがとう – simao

関連する問題