C'est parfois nécessaire pour des tests unitaires. Le problème est que sys.env
, System
et ProcessEnvironment
sont immuables. Ce n'est pas grave, on va faire un peu de réflexion 😁
def setEnv(name: String, value: String): Unit = {
val processEnvClass =
Class.forName("java.lang.ProcessEnvironment")
val unmodifiableEnvironmentField =
processEnvClass.getDeclaredField("theUnmodifiableEnvironment")
unmodifiableEnvironmentField.setAccessible(true)
val unmodifiableEnvironment =
unmodifiableEnvironmentField.get(null)
val unmodifiableMapClass =
Class.forName("java.util.Collections$UnmodifiableMap")
val mField =
unmodifiableMapClass.getDeclaredField("m")
mField.setAccessible(true)
val map =
mField
.get(theUnmodifiableEnvironment)
.asInstanceOf[java.util.Map[String, String]]
map.put(name, value)
}
Note : ça concerne principalement Scala, car dans ce langage on utilise principalement sys.env
pour accéder aux variables d'environnement.
En Java, si on passe par System.getenv
(majorité des cas), il n'y a pas de problème non plus. sys.env
utilise d'ailleurs par cette méthode. Par contre, si vous utilisez, ProcessBuilder.environment
vous ne verrez pas de modification dans les variables d'environnement, car cette méthode procède différemment pour les récupérer.
Photographie par Dan Meyers sur Unsplash.