2

我正在使用带有 Spray 和 WireMock 的 Akka actor 系统来存根 Web 服务。我还想验证外部 http 请求是否已经发出。

在以下用例中,向我的 Spray 服务器发出 POST 请求,该服务器应向外部服务发送请求:

stubFor(get(urlEqualTo("/external-service"))
    .willReturn(aResponse()
      .withStatus(200)
      .withBodyFile("response-body.json")));

myService ! Post("/my-service", FormData(Seq("id" -> "1")))

Thread.sleep(1000)

verify(postRequestedFor(urlEqualTo("/services/harvesterService")))

在各种示例中,我看到了 Thread.sleep 技术,否则 ActorSystem 将关闭,我的服务将永远不会向外部服务发出 http 请求。

有可能避免这种情况吗?WireMock 可以等待外部服务的请求吗?可能有一些超时......

4

1 回答 1

1

注意:这假设您的参与者在收到该消息时实际上发送了一个 HTTP 调用。如果您想直接测试喷雾路线,我建议您查看http://spray.io/documentation/1.2.3/spray-testkit/这是测试喷雾路线的标准方法。

通常我所做的是将 ScalaTest 与 Akka/Spray TestKit 一起使用,并使用该eventually功能。eventually允许您反复检查最终会发生的情况。如果您捕获了该方法抛出的异常verify,那么您可以断言该帖子是否已实际发送。你可以使用类似的东西

def postHasBeenSent(url: String): Boolean = 
  try {
    verify(postRequestedFor(urlEqualTo(url)))
    true
  } catch {
    case e: VerificationException => false
  }

(如果你愿意,你也可以使用Trymonad,但这不是重点!)

然后在您的测试中(假设您正在使用匹配器):

myService ! Post("/my-service", FormData(Seq("id" -> "1")))

eventually {
  postHasBeenSent("/my-service") shouldBe true
}

您可以在http://doc.scalatest.org/2.2.6/index.html#org.scalatest.concurrent.Eventually找到更多关于eventually它的所有优点(例如轮询间隔)

于 2016-03-02T10:32:29.543 回答