我有一個通過Http().cachedHostConnectionPoolHttps
與第三方服務集成的akka-http應用中的路由。我想以正確的方式測試它。但是不知道應該如何:(Akka Http:如何測試流量到第三方服務的路由?
下面是這條路線的樣子:
val routes: Route = pathPrefix("access-tokens") {
pathPrefix(Segment) { userId =>
parameters('refreshToken) { refreshToken =>
onSuccess(accessTokenActor ? GetAccessToken(userId, refreshToken)) {
case token: AccessToken => complete(ok(token.toJson))
case AccessTokenError => complete(internalServerError("There was problems while retriving the access token"))
}
}
}
}
這條路線的背後隱藏accessTokenActor
所有邏輯發生了,那就是:
class AccessTokenActor extends Actor with ActorLogging with APIConfig {
implicit val actorSystem = context.system
import context.dispatcher
implicit val materializer = ActorMaterializer()
import AccessTokenActor._
val connectionFlow = Http().cachedHostConnectionPoolHttps[String]("www.service.token.provider.com")
override def receive: Receive = {
case get: GetAccessToken => {
val senderActor = sender()
Source.fromFuture(Future.successful(
HttpRequest(
HttpMethods.GET,
"/oauth2/token",
Nil,
FormData(Map(
"clientId" -> youtubeClientId,"clientSecret" -> youtubeSecret,"refreshToken" -> get.refreshToken))
.toEntity(HttpCharsets.`UTF-8`)) -> get.channelId
)
)
.via(connectionFlow)
.map {
case (Success(resp), id) => resp.status match {
case StatusCodes.OK => Unmarshal(resp.entity).to[AccessTokenModel]
.map(senderActor ! AccessToken(_.access_token))
case _ => senderActor ! AccessTokenError
}
case _ => senderActor ! AccessTokenError
}
}.runWith(Sink.head)
case _ => log.info("Unknown message")
}
}
所以問題是如何測試這條路線更好,請記住帶有流的演員也存在其中。
在您的測試中實例化一個模擬網頁http服務器並接聽電話? –
@DiegoMartinoia是的,這是最明顯的例子。如果在這種情況下沒有別的方法可行,我會去做。其實我正在尋找一些阿卡流測試技術。類似於用假冒流替換......你對此有何看法? –
依賴注入和模擬的事情是,如果「真實」依賴項被破壞,那麼測試不會失敗。我在這方面是少數,但特別是當涉及到像遠程http調用這樣複雜的事情時,我喜歡黑盒子的東西。特別是Akka應用程序通常需要測試很多「奇怪」的東西(持久性,分片,集羣),我發現實際上旋轉應用程序並在兩端進行探測變得更容易。但那就是我 –