我有一些代码需要环境变量才能正确运行.但是当我运行我的单元测试时,它一旦达到那个点就会爆炸,除非我专门在终端中输出变量.我正在使用Scala和sbt.我的代码做了这样的事情:
class something() { val envVar = sys.env("ENVIRONMENT_VARIABLE") println(envVar) }
我如何在单元测试中模拟这个,这样每当调用sys.env("ENVIRONMENT_VARIABLE")时,它会返回一个字符串或类似的东西?
如果无法包装现有代码,则可以更改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"))