java - Scala库初始化设计

标签 java scala properties initialization sbt

我已经启动了一个名为 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 框架来说,这是一种合理的方法,但对于小型属性帮助程序库来说似乎太多了。

我真的有两个问题:

  1. 如何让 sbt 在所有测试运行之前使用正确的类加载器调用上述设置代码?
  2. 更重要的是,这是需要初始化的库的最佳设计,还是有更好的方法?

最佳答案

使用 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/

相关文章:

python - 设置属性的属性

java - 保持 i18n 资源同步

java - 使用谷歌应用程序引擎java sdk上传java应用程序

java - 基于管道的系统的架构/设计。如何改进这段代码?

java - 如何使用 javamail 将我网站的联系表单链接到我的邮件

Scala:如何根据值和标签获取枚举元素?

java - JFreeChart 的放大和缩小功能行为异常?

scala - 带有 ClassTags/TypeTags 的模式匹配函数签名

scala - Scodec:Coproducts 找不到参数 auto 的隐式值:scodec.codecs.CoproductBuilderAuto

c# - 如何在窗体之外访问和设置控件的属性?