2017-01-31 19 views
3

私はScalaJ-Httpをhttpクライアントとして使用しようとしています。リンク:https://github.com/scalaj/scalaj-httpScalaJ-Httpを使用する場合のユニットテスト方法は?

val response: HttpResponse[String] = Http("http://foo.com/search").param("q","monkeys").asStringのようなコード行を持つクラスの単体テストでは、HttpまたはHttpRequestをどのように偽装しますか?

クラスは、メソッド呼び出し引数からurlとparamsを受け取ります。だから私はHttpRequestを注射することはできません。

答えて

0

すでに解決策がある場合は、興味があります。私は同じ質問であなたのポストを見つけました。

最後に、Scalatra/Jettyを使用してテスト自体に「ダミーサービス」を作成し、そこに期待される応答を指定することで、これを解決しました。だから、それは本当に嘲笑ではありませんが、それは私のためにやります。

このアプローチの欠点は、Scalatra、Jetty-server、およびJetty-servletを余分な依存関係(オプションでscope = test)として含める必要があることです。

def mockService: Server = { 
    class MockedServlet extends ScalatraServlet { 

    get("/") { 
     // fill in whatever you expect here 
     Ok("I'm alive!") 
    } 
    } 

    class ServletMounter extends LifeCycle { 
    override def init(context: ServletContext): Unit = { 
     context.mount(new MockedServlet, "/mock") 
    } 
    } 

    new Server(20002) { 
    val servlet = new ServletContextHandler(ServletContextHandler.NO_SESSIONS) { 
     addEventListener(new ScalatraListener() { 
     override def probeForCycleClass(classLoader: ClassLoader): (String, LifeCycle) = { 
      (classOf[ServletMounter].getSimpleName, new ServletMounter) 
     } 
     }) 
    } 
    setHandler(servlet) 
    } 
} 

private val server = mockService 

override protected def beforeAll(): Unit = { 
    super.beforeAll() 
    server.start() 
} 

override protected def afterAll(): Unit = { 
    server.stop() 
    server.destroy() 
    super.afterAll() 
} 

// a simple test 
"service up" should "return a 200 when the mocked service is up" in { 
    val response = Http("http://localhost:20002/mock/").asString 
    response.code shouldBe 200 
    response.body shouldBe "I'm alive!" 
} 

編集3月2、2017: いくつかのより多くの検討の後、私は私が私の中でモックすることだと、私は「ファサード」トレイトでscalaj-http経由でHTTP呼び出しを持っているように私のコードを変更テスト。さて、実際のHTTPリクエストを行うのではなく、私はファサードを模擬し、予期したHTTPResponseを返送します。上記のソリューションと比較すると、これははるかにクリーンで、上記の依存関係はもはや必要ではなく、セットアップが簡単です。ファサードは、コンストラクタパラメータまたは自己型注釈としてHTTP呼び出しを行うクラスに「注入」することができます。

import scalaj.http.{Http, HttpRequest} 

/** 
    * This wraps the Scalaj Http object so it can be injected. 
    */ 
class ScalajHttp { 

    def url(url: String): HttpRequest = Http(url) 

} 

その後、あなたは簡単に別のクラスに注入することができます:私はそうのようなScalajHttpのラッパークラスを作成して何をしたか

+0

scala-j httpクライアントを含むクラスがモックサーバーに当たっていますか?それはうまくいくかもしれませんが、クライアントを嘲笑するためのソリューションが存在すれば理想的です。 – Nelson

0

class Foo(http: ScalajHttp) { 

    def doBar() = { 
    val response = http.url("http://...").asString 
    } 

} 

次にあなたがSpecs2のようなものを使用することができますモックのためにとScalajHttpのモックを作成します。

関連する問題