我已经启动了一个名为 omniprop 的开源 Scala 项目.我目前正在探索的功能是如何允许项目的用户堆叠 JVM 样式的属性提供程序。例如,您可能希望在 java.lang.System
、Lift 的 util.Prop
和 Typesafe 的 Config 库中查找属性。由于 omniprop 的一些其他限制/特性,我需要将此堆栈配置驻留在已知对象中,以便库的其他部分可以从此堆栈检索属性。
为了使 omniprop 正常工作,库的用户需要在访问任何属性之前调用此配置。因此,任何使用我的库的项目都需要一个可以设置提供程序堆栈的 Bootstrap /初始化程序。此初始配置代码的示例如下所示:
import com.joescii.omniprop.providers._
PropertyProviders.configure(List(
SystemPropertyProvider,
LiftPropsProvider
))
我面临的挑战尤其是测试。为了使使用 omniprop 的项目的测试代码能够正常工作,它必须在运行任何测试之前以某种方式运行上述代码。目前,我没有看到使用 sbt 或我熟悉的任何测试库(如 scalatest、scalacheck 或 specs2)执行此操作的干净方法。实际上,需要在每个测试套件中调用上面的代码片段,这当然不理想。
解决此问题的另一种方法是 Lift 所做的,其中每个项目都必须有一个名为 bootstrap.liftweb.Boot
的类,库会调用该类来设置所有内容。我发现对于像 Lift 这样的 Web 框架来说,这是一种合理的方法,但对于小型属性帮助程序库来说似乎太多了。
我真的有两个问题:
- 如何让 sbt 在所有测试运行之前使用正确的类加载器调用上述设置代码?
- 更重要的是,这是需要初始化的库的最佳设计,还是有更好的方法?
最佳答案
使用 ScalaTest ,当我不得不做类似的事情时,我创建了一个扩展 BeforeAndAfterAll
的特征,我将其混合到每个需要它的套件中。
trait Configure extends Suite with BeforeAndAfterAll {
override def beforeAll() { PropertyProviders.configure(/*...*/); }
override def afterAll() { PropertyProviders.configure(/*...*/); }
}
你只需像其他特征一样混合它
trait FooSpec extends Spec with Configure {
// ...
}
关于java - Scala库初始化设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21609048/