すでに解決策がある場合は、興味があります。私は同じ質問であなたのポストを見つけました。
最後に、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のラッパークラスを作成して何をしたか
scala-j httpクライアントを含むクラスがモックサーバーに当たっていますか?それはうまくいくかもしれませんが、クライアントを嘲笑するためのソリューションが存在すれば理想的です。 – Nelson