Testowanie aplikacji Play2 za pomocą SecureSocial przy użyciu wstrzykiwania zależności

Bardzo dziękuję za wszelkie wskazówki!

Wtyczka SecureSocial działa dobrze, gdy uruchamiam ją z przeglądarki, ale chciałbym teraz móc przetestować resztę mojej aplikacji Play.

Szybkie wprowadzenie

Składnia SecureSocial wygląda tak:

def page = SecuredAction(WithProvider("google")) { ... }

albo to:

def page = UserAwareAction { ... }

szukałemtutaj, co wydaje się być jedynym pytaniem na Stack Overflow nawet zdalnie powiązanym z moim problemem z SecureSocial, ale nie bardzo lubię przekodowywać kod bajtowy. Powinno być prostsze rozwiązanie tego.

Po uruchomieniu testów, które uzyskują dostęp do akcji chronionych SecureSocial, pojawia się duży błąd, który, jak sądzę, oznacza, że ​​nie przekazuję go użytkownikowi. (patrz na dole tego pytania)

Co chciałbym zrobić

Wstrzyknij wszystkie funkcje, aby zwrócić typAction zamiastSecuredAction lubUserAwareAction tylko podczas testów

Lub faktycznie przekaż testowego użytkownika do połączenia.Ale jak?

Co ja mam
@Singleton
class JsonOps @Inject() () extends Controller with SecureSocial {...}

A Global.scala napisane zgodnie z opisemtutaj iw moim teście ...

val controller = new JsonOps
val result = controller.userAwareActionRequestForSomeJson("")(FakeRequest())

Mam również takie połączenia:

// This is what I would use for production
def extjs = SecuredAction(WithProvider("google")) { implicit request =>
   Ok(views.html.extjs(request.user.firstName))
}
// This is what I would use for testing
def extjs = Action { implicit request =>
  Ok(views.html.extjs("testtesttesting"))
}

Dlatego myślę, że ten problem może być odpowiedni do wstrzykiwania zależności? Nie jestem jednak pewien, w jaki sposób wykonałbym instancję klasy, ponieważ używam Global.scala jest generycznym instancją klasy. Nie chcę szczególnie pisać 9000+ cech dla każdego kontrolera, który mam.

Duży błąd

To jest linia UserOpsSpec.scala linia 12 i 13:

12  val controller = new UserOps
13  val result = controller.extjs()(FakeRequest())

a to jest błąd

[error]     RuntimeException: java.lang.ExceptionInInitializerError (UserOpsSpec.scala:13)
[error] play.api.mvc.ActionBuilder$anon$1.apply(Action.scala:220)
[error] securesocial.core.SecureSocial$.authenticatorFromRequest(SecureSocial.scala:200)
[error] securesocial.core.SecureSocial$anonfun$SecuredAction$1.apply(SecureSocial.scala:81)
[error] securesocial.core.SecureSocial$anonfun$SecuredAction$1.apply(SecureSocial.scala:78)
[error] play.api.mvc.ActionBuilder$anon$1.apply(Action.scala:215)
[error] play.api.Play$anonfun$current$1.apply(Play.scala:51)
[error] play.api.Play$anonfun$current$1.apply(Play.scala:51)
[error] play.api.Play$.current(Play.scala:51)
[error] securesocial.core.Authenticator$.cookieName$lzycompute(Authenticator.scala:188)
[error] securesocial.core.Authenticator$.cookieName(Authenticator.scala:188)
[error] securesocial.core.Authenticator$.<init>(Authenticator.scala:201)
[error] securesocial.core.Authenticator$.<clinit>(Authenticator.scala)
[error] securesocial.core.SecureSocial$.authenticatorFromRequest(SecureSocial.scala:200)
[error] securesocial.core.SecureSocial$anonfun$SecuredAction$1.apply(SecureSocial.scala:81)
[error] securesocial.core.SecureSocial$anonfun$SecuredAction$1.apply(SecureSocial.scala:78)
[error] play.api.mvc.ActionBuilder$anon$1.apply(Action.scala:215)
[error] null
[error] securesocial.core.SecureSocial$.authenticatorFromRequest(SecureSocial.scala:200)
[error] securesocial.core.SecureSocial$anonfun$SecuredAction$1.apply(SecureSocial.scala:81)
[error] securesocial.core.SecureSocial$anonfun$SecuredAction$1.apply(SecureSocial.scala:78)
[error] play.api.mvc.ActionBuilder$anon$1.apply(Action.scala:215)
[error] There is no started application
[error] play.api.Play$anonfun$current$1.apply(Play.scala:51)
[error] play.api.Play$anonfun$current$1.apply(Play.scala:51)
[error] play.api.Play$.current(Play.scala:51)
[error] securesocial.core.Authenticator$.cookieName$lzycompute(Authenticator.scala:188)
[error] securesocial.core.Authenticator$.cookieName(Authenticator.scala:188)
[error] securesocial.core.Authenticator$.<init>(Authenticator.scala:201)
[error] securesocial.core.Authenticator$.<clinit>(Authenticator.scala)
[error] securesocial.core.SecureSocial$.authenticatorFromRequest(SecureSocial.scala:200)
[error] securesocial.core.SecureSocial$anonfun$SecuredAction$1.apply(SecureSocial.scala:81)
[error] securesocial.core.SecureSocial$anonfun$SecuredAction$1.apply(SecureSocial.scala:78)
[error] play.api.mvc.ActionBuilder$anon$1.apply(Action.scala:215)
[info]

questionAnswers(1)

yourAnswerToTheQuestion