使用不同的配置文件进行集成测试

时间:2014-05-05 22:06:33

标签: scala sbt typesafe-config

我有一个sbt项目,它定义了集成测试配置。 Build.scala:

  lazy val root =
    Project("root", file("."))
      .configs( IntegrationTest )
      .settings( Defaults.itSettings : _*)

build.sbt有(除其他外):

    libraryDependencies ++=Seq(
      "org.scalatest" % "scala-test_2.10" % "1.0.8" % "test,it",
      "com.typesafe" % "config" % "1.2.0")

现在我在reference.conf下面有一个src/main/resources文件:

resources {
    postgresAdapter {
        db = "prod"
    }
}

,同样在src/it/resources下:

resources {
    postgresAdapter {
        db = "integration"
    }
}

我有以下课程:

class PostgresAdapter{
  private val db = ConfigFactory.load.getConfig("resources").getString("postgresAdapter.db")

  private def connection: Try[java.sql.Connection] = {
    val _ = classOf[org.postgresql.Driver]
    Try(DriverManager.getConnection(s"jdbc:postgresql://dbserver/$db", "user", "password"))
  }
}

我希望db使用prod进行初始化,如果我执行sbt run并使用integration进行初始化sbt it:test。 是否可以配置sbt和/或Typesafe配置以产生此效果,还是应该使用不同的方法?

PS:我希望避免在配置文件中使用db_proddb_integration参数进行生产。

1 个答案:

答案 0 :(得分:1)

我认为你可能有一个问题(没有在类路径上得到你的两个文件夹或者没有按正确的顺序)或者你可能有一个Typesafe配置问题(它不是在读取两个reference.conf,它们是在classpath)。

Typesafe Config指定从类路径加载两者的顺序:https://github.com/typesafehub/config/blob/master/HOCON.md#conventional-configuration-files-for-jvm-apps

您可以klass.getClassLoader().getResources("reference.conf")查看您的两个reference.conf出现的订单。如果您首先使用src/it/resources,那么它应该覆盖我认为您想要的src/main/resources那个?

如果你没有在类路径上同时拥有reference.conf,那么你有一个问题(或者至少,你的第一个问题是sbt),你需要在类路径上获得额外的文件夹。

还有其他方法可以使用Typesafe配置来处理此问题,例如加载额外资源(如果存在,如ConfigFactory.parseResources("testing.conf"))并覆盖设置,或者在jvm命令行上分配集成测试和设置系统属性比如-Dresources.postgresAdapter.db ...我确定还有其他创意解决方案,只取决于你想要的。

我会把它变成一个维基,如果你的问题变成了问题,尤金可能会帮你解决问题!

(如果Typesafe配置未按指定工作,请在https://github.com/typesafehub/config/issues提交错误