Search code examples
scalasbtscalatest

Setting environment variables when running Scala / SBT test suite


I've created a Config object with a get method to return different strings based on the PROJECT_ENV environment variable. If PROJECT_ENV=test, then Config.get("somePath") returns some/path.csv, otherwise it returns s3a://some_bucket/a_file.csv.

object Config {

  def test(): Map[String,String] = {
    Map(
      "somePath" -> "some/path.csv"
    )
  }

  def default(): Map[String,String] = {
    Map(
      "somePath" -> "s3a://some_bucket/a_file.csv"
    )
  }

  def get(key: String, env: Option[String] = sys.env.get("PROJECT_ENV")): String = {
    val lookupMap = if (env == Some("test")) {
      List(default(), test()).flatten.toMap
    } else {
      default()
    }
    lookupMap(key)
  }

}

With Ruby / RSpec, I set the environment variable in the spec_helper.rb file with ENV['PROJECT_ENV'] = 'test'.

What is the scalatest equivalent of the spec_helper.rb file? How can I set an environment variable in Scala? This answer isn't sufficient.

My test suite runs successfully if I run $ PROJECT_ENV=test sbt test, but I want to simply run $ sbt test.


Solution

  • This question appears to have overlap with Set default env variable for test configuration in sbt .

    The accepted answer over there worked well for me:

    fork in Test := true
    envVars in Test := Map("PROJECT_ENV" -> "test")
    

    The key is to make sure to include the fork otherwise the same env in play when launching sbt gets used.