5

HTTP リクエストを処理するコードがいくつかあり、それを単体テストしたいと考えています。
したがって、私はdispatch.Httpまたはより良いdispatch.HttpExecutor(0.8.5)をScala(2.9.1.final)、Mockito(1.9.0-rc1)、およびScalaTest(1.6.1)でモックしようとしていますが、できます.テスト コードをコンパイル可能にしないでください。
ここで MyHttpTest では、任意の HTTP 要求に対して特定の HTTP 応答を受信したいと考えています。

import org.scalatest.FunSuite
import org.scalatest.mock.MockitoSugar
import org.mockito.Mockito.when
import org.mockito.Matchers.any
import dispatch._

class MyHttpTest extends FunSuite with MockitoSugar {
  test("example") {
    val httpMock = mock[HttpExecutor]
    when(httpMock.apply(any(classOf[Handler[String]]))).thenReturn("Some_HTTP_response")
  }
}

しかし、コンパイルエラーが発生します:

error: overloaded method value thenReturn with alternatives:
(httpMock.HttpPackage[String],<repeated...>[httpMock.HttpPackage[String]])org.mockito.stubbing.OngoingStubbing[httpMock.HttpPackage[String]] <and>
(httpMock.HttpPackage[String])org.mockito.stubbing.OngoingStubbing[httpMock.HttpPackage[String]]
cannot be applied to (java.lang.String)
when(httpMock.apply(any(classOf[Handler[String]]))).thenReturn("Some_response")

では、ディスパッチクライアントをモックする方法は?

4

2 に答える 2

6

私は、 Mockitoの代わりにScalaMockを試してみるべきだという提案でこれに答えるつもりでした。なぜなら、あなたが抱えている問題は、MockitoがScalaを本当に理解していないことが原因であると誤って想定したからです(ScalaMockはScalaでゼロから作成されました)。でも:

  1. それはあなたの問題ではありません、そして
  2. HttpExecutorパッケージオブジェクト()で定義された型を処理する方法がわからないため、モックを作成しようとするとScalaMockが失敗することがわかりましたExceptionListener。くそ!私はそれをできるだけ早く修正します-それを私の注意を引いてくれてありがとう。

HttpExecutor#HttpPackageとにかく、それは抽象型であるため、のインスタンスを作成することはできません。HttpExecutorしたがって、それを回避するには、拡張してHttpPackage具体的にする必要があります。例えば:

class MyHttpTest extends FunSuite with MockitoSugar {
  trait TestHttpExecutor extends HttpExecutor {
    type HttpPackage[T] = T
  }
  test("example") {
    val httpMock = mock[TestHttpExecutor]
    when(httpMock.apply(any(classOf[Handler[String]]))).thenReturn("Some_HTTP_response")
  }
}
于 2011-12-26T18:10:44.827 に答える
1

Scalaについては何も知りません。しかし、原則として、自分のものではないクラスをモックしようとすべきではありません。上記の HttpExecutor はそのようなクラスの 1 つであると私には思えます。

テスト容易性のために非常にうまく機能するパターンは、そのようなクラスのラッパーとして機能するが、独自の機能を持たないクラスを開発することです。次に、(少なくとも) 2 つの別個のテスト クラスを記述します。

  • HttpExecutor を正しく呼び出していることを確認するための、ラッパー クラスの統合テスト クラス。
  • ラッパー クラスを使用するクラスの単体テスト クラス。

統合テスト クラスには、モックを一切含めるべきではありません。単体テストには、ラッパー クラスのモックが含まれます。

私があなたの質問を誤解していて、HttpExecutor が本当にあなた自身のクラスである場合は、もう一度投稿してください。別の回答を提供しようとします。

于 2011-12-26T09:01:45.663 に答える