我有 FlatSpec 测试类,需要对一些夹具数据使用 REST 服务。当一次运行所有测试时,我真的只想实例化一次 REST 客户端,因为它可能非常昂贵。当我在我的 IDE 中运行时,我该如何解决这个问题,并且我还能让它运行一个测试类吗?
问问题
1589 次
2 回答
1
1.使用模拟:
我建议您在尝试测试 REST 服务时使用某种模拟。您可以尝试例如 scala-mock。创建模拟服务不消耗时间/CPU,因此您可以在所有测试中创建模拟并且不需要共享它们。看:
trait MyRestService {
def get(): String
}
class MyOtherService(val myRestService: MyRestService) {
def addParentheses = s"""(${myRestService.getClass()})"""
}
import org.scalamock.scalatest.MockFactory
class MySpec extends FreeSpec with MockFactory {
"test1 " in {
// create mock rest service and define it's behaviour
val myRestService = mock[MyRestService]
val myOtherService = new MyOtherService(myRestService)
inAnyOrder {
(myRestService.get _).expects().returning("ABC")
}
//now it's ready, you can use it
assert(myOtherService.addParentheses === "(ABC)")
}
}
2.或者使用共享灯具:
如果您仍想使用 REST 服务的实际实现并仅创建一个实例,然后使用以下方法与一些测试条件共享它:
get-fixture 方法 => 当您在多个测试中需要相同的可变夹具对象时使用它,并且不需要在之后清理。
withFixture(OneArgTest) => 当所有或大多数测试需要相同的固定装置时使用,这些固定装置必须在之后清理。
有关更多详细信息和代码示例,请参阅http://www.scalatest.org/user_guide/sharing_fixtures#loanFixtureMethods。
如果您想针对多个套件共享相同的夹具,请使用org.scalatest.Suites和@DoNotDiscover注释(这些至少需要 scalatest-2.0.RC1)
于 2013-10-08T17:35:15.643 回答
0
Pawel 的最后评论很合适。通过使用 BeforaAndAfterAll 而不是 Suites 从 Suite 继承会更容易。
import com.typesafe.config.ConfigFactory
import com.google.inject.Guice
import org.scalatest.{BeforeAndAfterAll, Suite}
import net.codingwell.scalaguice.InjectorExtensions.ScalaInjector
class EndToEndSuite extends Suite with BeforeAndAfterAll {
private val injector = {
val config = ConfigFactory.load
val module = new AppModule(config) // your module here
new ScalaInjector(Guice.createInjector(module))
}
override def afterAll {
// your shutdown if needed
}
override val nestedSuites = collection.immutable.IndexedSeq(
injector.instance[YourTest1],
injector.instance[YourTest2] //...
)
}
于 2015-06-25T09:12:33.377 回答