gpt4 book ai didi

scala - Specs2:如何测试具有多个注入(inject)依赖项的类?

转载 作者:行者123 更新时间:2023-12-04 10:24:15 25 4
gpt4 key购买 nike

Play 2.4 应用程序,使用 dependency injection对于服务类。

我发现当正在测试的服务类具有多个注入(inject)依赖项时,Specs2 会阻塞。它因“ 找不到类的构造函数 ... ”而失败

$ test-only services.ReportServiceSpec
[error] Can't find a constructor for class services.ReportService
[error] Error: Total 1, Failed 0, Errors 1, Passed 0
[error] Error during tests:
[error] services.ReportServiceSpec
[error] (test:testOnly) sbt.TestsFailedException: Tests unsuccessful
[error] Total time: 2 s, completed Dec 8, 2015 5:24:34 PM

生产代码 ,剥离到最低限度以重现此问题:
package services

import javax.inject.Inject

class ReportService @Inject()(userService: UserService, supportService: SupportService) {
// ...
}

class UserService {
// ...
}

class SupportService {
// ...
}

测试码 :
package services

import javax.inject.Inject

import org.specs2.mutable.Specification

class ReportServiceSpec @Inject()(service: ReportService) extends Specification {

"ReportService" should {
"Work" in {
1 mustEqual 1
}
}

}

如果我删除 UserServiceSupportService来自 ReportService 的依赖,测试有效。但显然,依赖项存在于生产代码中是有原因的。 问题是,我如何使这个测试工作?

编辑 :当尝试在 IntelliJ IDEA 中运行测试时,同样的事情失败了,但有不同的消息:“测试框架意外退出”,“这看起来像一个 specs2 异常......”;见 full output with stacktrace .我打开了 Specs2 issue按照输出中的指示,虽然我不知道问题是出在 Play 还是 Specs2 或其他地方。

我的库依赖项如下。 (我尝试指定 Specs2 版本 explicitly ,但这没有帮助。看起来我需要 specs2 % Test 原样,以便 Play 的测试类(如 WithApplication 工作。)
resolvers += "scalaz-bintray" at "https://dl.bintray.com/scalaz/releases"
libraryDependencies ++= Seq(
specs2 % Test,
jdbc,
evolutions,
filters,
"com.typesafe.play" %% "anorm" % "2.4.0",
"org.postgresql" % "postgresql" % "9.4-1205-jdbc42"
)

最佳答案

specs2 中对依赖注入(inject)的支持有限,主要用于执行环境或命令行参数。

没有什么可以阻止您只使用 lazy val和你最喜欢的注入(inject)框架:

class MySpec extends Specification with Inject {
lazy val reportService = inject[ReportService]

...
}

Play and Guice ,你可以有一个这样的测试助手:
import play.api.inject.guice.GuiceApplicationBuilder
import scala.reflect.ClassTag

trait Inject {
lazy val injector = (new GuiceApplicationBuilder).injector()

def inject[T : ClassTag]: T = injector.instanceOf[T]
}

关于scala - Specs2:如何测试具有多个注入(inject)依赖项的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34159857/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com