我有FlatSpec测试类,需要为某些灯具数据使用REST服务。在一次运行所有测试时,我只想实例化REST客户端一次,因为它可能非常昂贵。我怎样才能解决这个问题?当我在IDE中运行时,我是否还可以运行它来运行一个测试类?
答案 0 :(得分: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 methods =&gt;在多次测试中需要相同的可变夹具对象时使用它,之后不需要清理。
withFixture(OneArgTest)=&gt;当所有或大多数测试需要相同的灯具时必须清除后才能使用。
有关更多详细信息和代码示例,请参阅http://www.scalatest.org/user_guide/sharing_fixtures#loanFixtureMethods。
如果您想与多个套件共享相同的灯具,请使用 org.scalatest.Suites 和 @DoNotDiscover 注释(这些至少需要scalatest-2.0.RC1)< / p>
答案 1 :(得分:0)
Pawel的最后评论很合适。 通过使用BeforaAndAfterAll而不是套件继承套件会更容易。
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] //...
)
}