Rya*_*son 9 unit-testing scala environment-variables
我有一些代码需要环境变量才能正确运行.但是当我运行我的单元测试时,它一旦达到那个点就会爆炸,除非我专门在终端中输出变量.我正在使用Scala和sbt.我的代码做了这样的事情:
class something() {
val envVar = sys.env("ENVIRONMENT_VARIABLE")
println(envVar)
}
Run Code Online (Sandbox Code Playgroud)
我如何在单元测试中模拟这个,这样每当调用sys.env("ENVIRONMENT_VARIABLE")时,它会返回一个字符串或类似的东西?
Yur*_*kha 11
如果无法包装现有代码,则可以更改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")
Run Code Online (Sandbox Code Playgroud)
如果需要测试控制台输出,可以使用单独的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"))
Run Code Online (Sandbox Code Playgroud)
理想情况下,应重写环境访问以安全地检索数据。要么使用默认值...
scala> scala.util.Properties.envOrElse("SESSION", "unknown")
res70: String = Lubuntu
scala> scala.util.Properties.envOrElse("SECTION", "unknown")
res71: String = unknown
Run Code Online (Sandbox Code Playgroud)
...或者作为一个选项...
scala> scala.util.Properties.envOrNone("SESSION")
res72: Option[String] = Some(Lubuntu)
scala> scala.util.Properties.envOrNone("SECTION")
res73: Option[String] = None
Run Code Online (Sandbox Code Playgroud)
...或两者兼而有之[参见envOrSome()]。
我不知道有什么方法可以让它看起来像是设置了任何/所有随机环境变量,而在运行测试之前没有实际设置它们。
| 归档时间: |
|
| 查看次数: |
5076 次 |
| 最近记录: |