2013-05-08 7 views
8

私はScala 2.10、specs2とMockitoを使用しています。私はscala.io.Source.fromURL()をモックしたいです。問題は、fromURL()がio.Source's objectの関数であるようです。ScalaのオブジェクトのMockito

val m = mock[io.Source] 
m.fromURL returns io.Source.fromString("Some random string.") 

ユニットテストではかなり簡単です。なぜそれは働いていないのですか?

ありがとうございます!

val m = spy(io.Source) 

または、次のようにあなたがそれをモックでした:

val m = mock[io.Source.type] 

しかし、その後、どのようにSourceを使用しているクラスでは、あなたが代わりにそれをからかうのは次のよう

答えて

19

することは、あなたはspyingにそれを試みることができますテストですか?あなたがそのような例のクラスがあった場合:

class MyClass{ 
    val source = io.Source 
    def foo = { 
    source.doSomething 
    } 
} 

そして、あなたのテストは希望:

class MyClass{ 

    def foo = { 
    io.Source.doSomething //I know doSomething is not on Source, call not important 
    } 
} 

を次にからかっ/スパイを活用するために、あなたはそうのようなあなたのクラスを構築する必要があると思います

val mockSource = mock[io.Source.type] 
val toTest = new MyClass{ 
    override val source = mockSource 
} 

Javaの世界では、静的メソッドはモックのベーンです。 Scalaの世界では、オブジェクトへの呼び出しが単体テストの処理に厄介なこともあります。しかし、上記のコードに従えば、クラス内のオブジェクトベースの依存関係を適切に模倣することができます。

+0

偉大な答え!私はScalaを初めて使っているので、面倒です。友人が言ったように、それは依存性注入パターンに似ています。 –

+0

なぜio.BufferedSourceのmkStringが機能しないのですか?それはインスタンスメソッドです:https://gist.github.com/Marius-Stroe/5545901 –

+5

私はエラーが発生します:Mockitoは次のように偽装/スパイすることはできません: - 最終クラス - 匿名クラス - プリミティブタイプ –

関連する問題