12

暗黙のパラメーターが関係している場合に、Scala でテストを作成する方法を理解するのに少し苦労しています。

私は自分のコードとテストの次の(短いバージョン)を持っています:

実装 (Scala 2.10、Spray、Akka):

import spray.httpx.SprayJsonSupport._
import com.acme.ResultJsonFormat._

case class PerRequestIndexingActor(ctx: RequestContext) extends Actor with ActorLogging {
  def receive = LoggingReceive {
    case AddToIndexRequestCompleted(result) =>
      ctx.complete(result)
      context.stop(self)
  }
}


object ResultJsonFormat extends DefaultJsonProtocol {
  implicit val resultFormat = jsonFormat2(Result)
}

case class Result(code: Int, message: String)

テスト (ScalaTest と Mockito を使用):

"Per Request Indexing Actor" should {
    "send the HTTP Response when AddToIndexRequestCompleted message is received" in {
      val request = mock[RequestContext]
      val result = mock[Result]

      val perRequestIndexingActor = TestActorRef(Props(new PerRequestIndexingActor(request)))
      perRequestIndexingActor ! AddToIndexRequestCompleted(result)

      verify(request).complete(result)
    }
  }

この行verify(request).complete(result)は、暗黙的な Marshaller を使用しResultて JSON に変換します。

追加することでマーシャラーをスコープに入れることができimplicit val marshaller: Marshaller[Result] = mock[Marshaller[Result]]ますが、テストを実行するとマーシャラーの別のインスタンスが使用されるため、検証は失敗します。

モック Marshaller を明示的に渡してもcomplete失敗します。

では、暗黙的なパラメーターのモック オブジェクトを作成し、インスタンスが使用されていることを確認する方法をアドバイスできますか?

4

1 に答える 1

5

これはMatcher、マーシャラー引数に from Mockito を使用するのに最適な状況です。暗黙的なマーシャラーをモック アウトする必要はありません。本当にやりたいことは、期待したものと一致するマーシャラーのインスタンスでcomplete呼び出されたことを確認することだけです。resultまず、まだ行っていない場合は、次のようにインポートして Mockito マッチャーをスコープに含めます。

import org.mockito.Matchers._

次に、結果の参照一致が必要な場合は、次のように確認できます。

verify(request).complete(same(result))(any[classOf[Marshaller[Result]]])

または、結果に等しい一致が必要な場合は、次のようにすることができます。

verify(request).complete(eq(result))(any(classOf[Marshaller[Result]]))

マッチャーの秘訣は、1 つの引数に対して 1 つを使用すると、すべての引数に対してそれらを使用する必要があるため、1 つも使用する必要があることresultです。

于 2013-05-12T23:34:49.840 に答える