2016-06-09 91 views
0

嘿,我想測試下面的類:嘲諷Scala中生成java.lang.NoSuchMethodException

class Foo { 
def f: Int = 4 + g 

def g: Int = 2 
} 

我的測試如下:

class FooSpec extends PlaySpec with MockFactory { 
    val foo = new Foo() 
    "Foo" must { 
    "Call function f" in { 
     (foo.g _) 
     .expects() 
     .once() 
     .returns(5) 

     foo.f must be (9) 
    } 
    } 
} 

我的測試失敗說:

java.lang.NoSuchMethodException: Foo.mock$g$0() 
java.lang.Class.getMethod(Unknown Source) 
... 

我不知道,看看爲什麼...

我使用scalatest和scalamock:

"org.scalatestplus.play" %% "scalatestplus-play" % "1.5.0" % "test" 
"org.scalamock" %% "scalamock-scalatest-support" % "3.2.2" % "test" 

回答

3

我看到這裏有兩個問題:

  1. 你不能沒有真正嘲諷的對象建立嘲笑的答案:在創建val foo = new Foo(),但你必須mock這個類第一個:val foo = mock[Foo]
  2. 它看起來像ScalaMock不支持部分存根實例,所以你不能存根方法g,並期望它調用時調用f - 你會有以另一個類調用Foo.g的方式重構代碼 - 可能將其包裝在委託中。或者使用Mockito - 它不像在ScalaMock的編譯時那樣花哨,並且在運行時執行它的魔法,但它提供了一個模擬類的callRealMethod()的能力。

基本上ScalaMock工作時,你最好mockstub特質,而不是類 - 他們的宏不必處理的方法實際實現,並且沒有人會想到他們。