2013-05-08 73 views
8

我正在使用Scala 2.10,specs2和Mockito。我想模擬scala.io.Source.fromURL()。這個問題似乎來自URL()是io.Source's object中的一個函數。Scala中的對象Mockito

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

這是一個非常簡單的單元測試模擬。爲什麼它不工作?

謝謝!

回答

19

反而嘲笑它,你可以嘗試spying,如下所示:

val m = spy(io.Source) 

或者你可以如下嘲笑它:

val m = mock[io.Source.type] 

但後來你是如何在課堂上使用Source你正在測試?如果你有一個例子類,像這樣:

class MyClass{ 

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

然後,爲了充分利用嘲諷/間諜活動,你必須構造你的類像這樣:

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

然後測試會必須看起來像這樣:

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

在Java世界,靜態方法是嘲笑的禍根。在Scala世界中,調用對象對於單元測試來說也很麻煩。但是如果你遵循上面的代碼,你應該能夠在你的類中正確地模擬出一個基於對象的依賴關係。

+0

很好的回答!我是新來的Scala,我發現它很麻煩。正如一位朋友所說,它看起來類似於依賴注入模式。 – 2013-05-08 18:40:29

+0

爲什麼mocking io.BufferedSource的mkString不工作?這是一個實例方法:https://gist.github.com/Marius-Stroe/5545901 – 2013-05-09 06:20:33

+5

我得到一個錯誤:Mockito不能模擬/間諜以下: - 最終類 - 匿名類 - 原始類型 – 2015-06-05 13:06:07