2016-06-09 90 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特质,而不是类 - 他们的宏不必处理的方法实际实现,并且没有人会想到他们。