如何测试需要环境变量的代码?

时间:2015-12-01 19:10:46

标签: scala unit-testing environment-variables

我有一些代码需要环境变量才能正常运行。但是当我运行我的单元测试时,它一旦达到那个点就会爆炸,除非我专门在终端中输出变量。我正在使用Scala和sbt。我的代码做了这样的事情:

class something() {

  val envVar = sys.env("ENVIRONMENT_VARIABLE")

  println(envVar)

}

如何在单元测试中模拟这个,这样每当调用sys.env(“ENVIRONMENT_VARIABLE”)时,它会返回一个字符串或类似的内容?

4 个答案:

答案 0 :(得分:10)

如果您无法包装现有代码,则可以更改UnmodifiableMap System.getenv()以进行测试。

def setEnv(key: String, value: String) = {
  val field = System.getenv().getClass.getDeclaredField("m")
  field.setAccessible(true)
  val map = field.get(System.getenv()).asInstanceOf[java.util.Map[java.lang.String, java.lang.String]]
  map.put(key, value)
}

setEnv("ENVIRONMENT_VARIABLE", "TEST_VALUE1")

如果需要测试控制台输出,可以使用单独的PrintStream。 您也可以实现自己的PrintStream。

val baos = new java.io.ByteArrayOutputStream
val ps = new java.io.PrintStream(baos)
Console.withOut(ps)(
  // your test code
  println(sys.env("ENVIRONMENT_VARIABLE"))
)

// Get output and verify
val output: String = baos.toString(StandardCharsets.UTF_8.toString)
println("Test Output: [%s]".format(output))
assert(output.contains("TEST_VALUE1"))

答案 1 :(得分:1)

理想情况下,应重写环境访问以便以安全的方式检索数据。使用默认值...

scala> scala.util.Properties.envOrElse("SESSION", "unknown")
res70: String = Lubuntu

scala> scala.util.Properties.envOrElse("SECTION", "unknown")
res71: String = unknown

......或作为选项......

scala> scala.util.Properties.envOrNone("SESSION")
res72: Option[String] = Some(Lubuntu)

scala> scala.util.Properties.envOrNone("SECTION")
res73: Option[String] = None

......或两者兼并[见envOrSome()]。

我不知道是否有任何方法可以让它看起来像任何/所有随机环境变量都没有在运行测试之前实际设置它们。

答案 2 :(得分:0)

我会将配置封装在一个不公开实现的装置中,可能是一个类 ConfigValue

我会将实现放在一个类 ConfigValueInEnvVar extends ConfigValue

这使我可以测试依赖 ConfigValue 的代码,而无需设置或清除环境变量。

它还允许我测试在环境变量中存储值作为单独功能的基本实现。

它还允许我将配置存储在数据库、文件或其他任何内容中,而无需更改我的业务逻辑。

我选择在应用层实现。 我将环境变量逻辑放在支持域中。 我将业务逻辑和特征/接口放在核心领域。

答案 3 :(得分:-1)

你不应该在单元测试中测试它。

提取出来

class F(val param: String) {
  ...
}

在您的产品代码中

new Foo(sys.env("ENVIRONMENT_VARIABLE"))