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 № 1O 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