2016-06-09 9 views
0

Hey Ich versuche, die folgende Klasse zu testen:Mocking in scala erzeugt ein java.lang.NoSuchMethodException

class Foo { 
def f: Int = 4 + g 

def g: Int = 2 
} 

Mein Test ist die folgende:

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) 
    } 
    } 
} 

Mein Test versagt, dass zu sagen:

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

ich bin nicht sicher, warum, um zu sehen ...

I scalatest und scalamock bin mit:

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

Antwort

3

Ich sehe zwei Probleme:

  1. Sie sich nicht spotten Antworten, ohne tatsächlich spöttisch ein Objekt herstellen können: Sie erstellen val foo = new Foo(), aber Sie müssen mock diese Klasse Erstens: val foo = mock[Foo]
  2. Es sieht aus wie ScalaMock nicht unterstützt teilweise Stubbing Instanzen, so können Sie nicht stub Methode g und erwarten, dass es aufgerufen wird, wenn Sie f aufrufen - Sie haben Um Ihren Code so zu restrukturieren, dass Foo.g von einer anderen Klasse aufgerufen wird - wickeln Sie ihn vielleicht in einen Delegaten. Oder benutze Mockito - es ist nicht so schick und mag seine Magie in Runtime im Gegensatz zu ScalaMocks Kompilierzeit, aber es bietet eine Fähigkeit zu callRealMethod() auf eine gespottete Klasse.

Grundsätzlich ScalaMock funktioniert am besten, wenn Sie mock oder stub Züge, keine Klassen - ihre Makros nicht die tatsächlichen Implementierungen der Methoden verarbeiten müssen, und niemand würde erwarten, dass sie zu.