2014-11-14 2 views
1

다음 코드 "MockFunction1이 StubFunction1 캐스트 할 수없는"제공 :ScalaMock는

import org.scalamock.scalatest.MockFactory 
import org.scalatest.FlatSpec 

trait SomeTrait { 
    def getLongByInt(int: Int): Long 
} 

class TestScalaMock extends FlatSpec with MockFactory { 
    "Scala Mock" should "mock my trait" in { 
    val someTrait = mock[SomeTrait] 
    (someTrait.getLongByInt _) when (1) returns 2L 
    assert(2L == someTrait.getLongByInt(1)) 
    } 
} 

나에게 런타임 오류 org.scalamock.MockFunction1 cannot be cast to org.scalamock.StubFunction1를 제공합니다. 프로젝트 종속성은 다음과 같습니다.

scalaVersion := "2.11.0" 

libraryDependencies ++= Seq(
    "com.typesafe.akka" %% "akka-actor" % "2.3.7", 
    "com.typesafe.akka" %% "akka-testkit" % "2.3.7", 
    "org.scalatest" % "scalatest_2.11" % "2.2.1" % "test", 
    "org.scalamock" %% "scalamock-scalatest-support" % "3.2" % "test" 
) 

아이디어가 있습니까? 감사!

답변

9

ScalaMock은 expectation-first와 record-then-verify (Mockito 스타일)의 두 가지 다른 스타일을 지원합니다.

가짜 개체를 만들려면 먼저 mock을, 기대치를 설정하려면 expects을 사용하십시오.

record-then-verify의 경우 stub을 사용하여 가짜 개체를 만들고 when은 반환 값을 설정하고 verify은 호출을 확인합니다.

코드에서 (예상 - 우선)과 when (레코드 - 검증 후)을 함께 사용하고 있습니다. 대신 expects을 사용하면 좋을 것입니다.

(단 하나의 테스트에서는 여러 가지 스타일을 혼합 할 수 있지만 하나의 가짜 개체에는 사용할 수 없음).

+0

에는 하나가 아닌 두 개의 다른 객체가있는 것이 이상하게 보입니다. 언뜻 보면 '모의 (mock)'는 쓰기 전용으로 보인다. 내가 왜이게 ​​있는지 놓치고 있니? – simbo1905

+0

죄송 합니다만, "쓰기 전용"의 의미를 이해하지 못하셨습니까? 하나의 유형의 가짜 객체가 조롱 스타일을 모두 지원하도록하는 방법이 있다면, 나는 그것을 듣고 싶지만, 이것이 지금 어떻게 달성 될 수 있는지 분명하지 않습니다. –

+1

이 유형의 문제가 런타임이 아닌 컴파일 타임에 잡힐 수있는 방법이 있다면 좋을 것입니다. 하지만 컴파일 타임 타입의 'mock [SomeTrait]'와 'Stub [SomeTrait]'는 SomeTrait가되어야합니다. 그렇지 않다면 ScalaMock은 조롱 한 프레임 워크가해야하는 일을하지 않을 것입니다. 그러나 ScalaMock 프레임 워크가 런타임에서 프로그래머가이 실수를 한 다음 예외 메시지에 유용한 제안을 할 때이를 식별 할 수 있는지 궁금합니다. –