Я пытаюсь записать модульное тестирование на сервер akka-http (route), но у меня возникают проблемы с директивой авторизации. Я просто хочу игнорировать (издеваться) директиву авторизации.
Минимальная версия моего кода:
object App {
val logger: Logger = Logger[App]
def main(args: Array[String]): Unit = {
implicit val system: ActorSystem = ActorSystem("my-system")
implicit val executionContext: ExecutionContextExecutor = system.dispatcher
val service = new TestRoute()
val bindingFuture = Http().bindAndHandle(service.route, "0.0.0.0", 8080)
bindingFuture.onComplete {
case Success(_) => println(s"listening on localhost:8080")
case Failure(error) => println(s"failed: ${error.getMessage}")
}
}
object TestRoute {
def authorize: Directive1[JsObject] = extractCredentials.flatMap {
case Some(OAuth2BearerToken(token)) => verifyToken(token) match {
case Success(t) =>
logger.debug("token verified successfully")
provide(t)
case Failure(t) =>
logger.warn(s"token is not valid: ${t.getMessage}")
reject(Rejections.validationRejection(t.getMessage))
}
case _ =>
logger.warn("no token present in request")
reject(AuthorizationFailedRejection)
}
def verifyToken(token: String): Try[JsObject] = {
val source = Source.fromResource("public_production.pem")
val fileData = try source.mkString finally source.close()
JwtSprayJson.decodeJson(token, fileData, Seq(JwtAlgorithm.RS256))
}
}
class TestRoute {
val route: Route =
TestRoute.authorize { jwtClaims =>
println(jwtClaims)
complete("sucess")
}
}
}
Я хочу проверить маршрут в TestRoute
. Так что authorize
это директива, которую я хочу издеваться. Я просто хочу контролировать то, что вернет authorize
, без необходимости фактически входить в функцию.
Мой коллега предложил обернуть Route в некоторый класс, который будет принимать метод authorize
в качестве аргумента Так, что в модульном тесте я могу очень легко управлять им. Но я ищу ложный ответ.
Я видел несколько примеров с Mockito, но ни один из них не был совместим с моей самой масштабной версией, которая является 3.1.0
.