/ / Classe de teste PlaySpec não selecionada se estiver usando injeção - scala, injeção de dependência, playframework, scalatest

A classe de teste PlaySpec não é selecionada se estiver usando injeção - scala, injeção de dependência, playframework, escalar

No meu aplicativo Play 2.6.x, estou testando com PlaySpec. Agora eu gostaria de injetar algum objeto para ser usado no código de teste.

class AuthControllerTest @Inject()(userRepository: UserRepository)
extends PlaySpec with GuiceOneAppPerSuite with Injecting {

"Foo bar" should {
"do xyz" in {
// do something with userRepository
}
}
}

No entanto, essa classe nunca é escolhida para testes, por exemplo, ao correr sbt test.

Uma solução simples é obter manualmente o injetor da instância atual do Play, mas Play.current está obsoleto e geralmente parece hacky:

class AuthControllerTest
extends PlaySpec with GuiceOneAppPerSuite with Injecting {

"Foo bar" should {
"do xyz" in {
val userRepository = Play.current.injector.instanceOf[UserRepository]
// do something with userRepository
}
}
}

Por que o exemplo anterior não funciona? E existe uma abordagem mais limpa que o exemplo anterior?

Respostas:

2 para resposta № 1

O Play Framework não faz injeção de dependência para testes como o primeiro exemplo. No segundo, você não precisa Play.current Desde a GuiceOneAppPerSuite faz um aplicativo (app) disponível para você. Então você pode fazer:

val userRepository = app.injector.instanceOf[UserRepository].

E usando Injecting você pode simplificá-lo ainda mais como:

val userRepository = inject[UserRepository]

E do documentos oficiais:

Se todos ou a maioria dos testes em sua classe de teste precisam de um Aplicativo, e todos eles podem compartilhar a mesma instância do Aplicativo, misture a característica GuiceOneAppPerSuite com a característica GuiceFakeApplicationFactory. Você pode acessar o aplicativo no campo do aplicativo.

Há também um destaque sobre Injecting Aqui:

https://www.playframework.com/documentation/2.6.x/Highlights26#Injecting