我需要导入不同的库并根据我的源的使用做一些不同的事情,即运行和测试。
如果我有各种类似于生产的源文件:
import scala.slick.driver.PostgresDriver.simple._
import Database.threadLocalSession
case class SomeBusinessObject(...)
将测试结果更改为以下内容的好方法是什么(意思是我想在测试期间使用不同的数据库):
import scala.slick.driver.h2.simple._
import Database.threadLocalSession
case class SomeBusinessObject(...)
哦,然后还有一个数据库类来保存我正在使用的数据库的密钥:
import scala.slick.driver.PostgresDriver.simple._
// Use the implicit threadLocalSession
import Database.threadLocalSession
object DB{
val get = {
Database.forURL("jdbc:postgresql:test:slick",
driver="org.postgresql.Driver",
user="postgres",
password="xxxx")
}
}
我做了一些研究,看起来像蛋糕模式可能是这类事物的关键,但如果有人能让我开始(如果蛋糕是正确的方法)那将是很好的。
更新
自从提出这个问题以来,我在Slick examples找到了我想要的内容。它真的把它分开了!几个星期前我在这些例子中进行过工作,但是不记得我在哪里看到了这个。
答案 0 :(得分:1)
你可以建立在scala允许你使用" import"嵌套在类,对象或特征中(而不仅仅是在根级别):
使用scala.collection.mutable.Map和scala.collection.immutable.Map的示例(假设我们要在测试中使用Map的不可变版本,并在生产中使用可变版本)
scala> trait Import1 {
| import scala.collection.mutable.{Map => iMap}
| def Test = iMap(1 -> "a")
| }
defined trait Import1
scala> trait Import2 {
| import scala.collection.immutable.{Map => iMap}
| def Test = iMap(1 -> "a")
| }
defined trait Import2
现在你可以这样做:
scala> object ProductionThing extends Import1
defined module ProductionThing
scala> ProductionThing.Test
res6: scala.collection.mutable.Map[Int,java.lang.String] = Map(1 -> a)
scala> object TestingThing extends Import2
defined module TestingThing
scala> TestingThing.Test
res7: scala.collection.immutable.Map[Int,java.lang.String] = Map(1 -> a)
或者您可以使用相同的机制来在类中定义导入范围并将该类注入SomeBusinessObject。