我移动了我的单元测试:
class UserSpec extends PlaySpec with OneAppPerTest with BeforeAndAfter with AsyncAssertions
{
致:
class UserSpec @Inject() (implicit exec: ExecutionContext, db: DBConnectionPool)
extends PlaySpec with OneAppPerTest with BeforeAndAfter with AsyncAssertions
{
第一个版本的一切都很好,但现在,当我启动测试时,我得到以下结果:
[info] No tests were executed.
[success] Total time: 4 s, completed Dec 5, 2016 8:35:24 PM
请注意,我并不希望我的测试在测试和生产中注入相同的依赖关系。谢谢!
答案 0 :(得分:3)
在使用scalatest编写Play测试时,您不会使用构造函数注入。
相反,当您在服务器或应用特征(例如app.injector
)中混合时,您可以直接在OneAppPerTest
字段内访问注入器。这样,如果您需要DI图中的任何内容,您可以在测试套件中注入一个字段:
val example = app.injector.instanceOf[Example]
所以你的初始代码是正确的方法,直接使用注射器混合。它可能看起来像这样:
class UserSpec extends PlaySpec with OneAppPerSuite
with BeforeAndAfter with AsyncAssertions {
implicit val exec : ExecutionContext = app.injector.instanceOf[ExecutionContext]
val db : DBConnectionPool = app.injector.instanceOf[DBConnectionPool]
// ...
}
就自定义测试的DI绑定而言,您可以通过GuiceApplicationBuilder
自定义应用实例来覆盖它们,请参阅Creating Application Instances for Testing和Testing with Guice。
答案 1 :(得分:0)
当你测试一个需要依赖注入的类时,这个类需要一个将对象注入这些类的应用程序。在测试中,您必须手动创建此应用程序。通过在测试套件的开头添加以下行来实现:
import play.api.inject.guice.GuiceApplicationBuilder
class UserSpec extends PlaySpec with OneAppPerTest with BeforeAndAfter with AsyncAssertions {
override def newAppForTest(td: TestData) = new GuiceApplicationBuilder().build()
[...]
请注意,您可以使用特殊conf修改此应用程序以进行测试。请参阅the play documentation for more details。
我为这个案例创建的应用程序很小而且开源。有关我如何实现此问题的更多详细信息,请参阅:https://github.com/gbersac/electricity_manager